Is PHP thread-safe?
- 在Linux/Unix上,PHP(从5.2开始)线程是否安全?
- 是否可以将它与Apache Worker MPM或Event MPM一起使用?
到目前为止,我收集到的事实还没有定论:
- 大多数发行版中包含的默认二进制文件都禁用了ZT,所以我知道我必须重新编译它们。
- 理论上,启用ZTS的Zend引擎(核心PHP)是线程安全的。
- 据说有些模块可能不是线程安全的,但我没有找到任何模块列表。
- php faq的状态和上面的差不多。
你有什么经验?
这不仅与分段错误有关(Windows术语中的"访问冲突")。螺纹安全还有很多。
- 虽然这是一个热门话题,但这是一个非常好的问题。有些东西要么是线程安全的,要么不是线程安全的。"中间的某个地方"是这里讨论的一个好话题。
- 请参见官方的PHP警告:"我们不建议在Apache2的生产中使用线程化MPM"。相关信息:web.archive.org/web/20160412171006/https://docs.newrelic.com‌&8203;/…
我知道gettext和set_locale不是threadsafe。PHP不应与线程MPM一起使用。
PHP还不是线程安全的。运行php不是线程化的。
- 是的,我以前读过那篇文章。但它没有提供太多的事实。此外,segfaults(或"访问冲突")与线程安全没有太大关系。
- 是的。如果segfaults是由于对共享变量的不正确的线程访问导致内存访问冲突,那么这正是您想要避免的问题。这不仅与segfault/访问冲突有关,而且如果它确实存在segfault,那么就不必再费心进一步查找,因为它绝对不是线程安全的。
- 是啊。我使用nginx和php fpm是因为gettext不是线程安全的:stackoverflow.com/questions/1646249/…
- 这篇文章现在快10年了。PHP还不安全吗?
- @Pacerier设置的区域还不是线程安全的。
- @Ois,顺便问一下,你是怎么/从哪里得到信息的?
- @起搏器就在这里
- @ois,nice,有没有所有线程不安全的函数的编译?或者我们需要检查每个函数,看看它们是否是线程不安全的?
- @Pacerier您可以下载手册和grep以获取警告和线程?或者在这里聊天或者在Reddit上提问。
- @顺便说一句,这个方法可靠吗?手册是否甚至保证它会警告线程安全性,以防出现此类线程问题的使用?我更多的是沿着一个文档的行来思考,这个文档有一个"编译"或者线程安全问题的列表(例如php.net/manual/en/migration54.incompatible.php)。
- 除了setlocale和gettext,我从未见过其他非线程安全的PHP函数。
- getText和setLocale:最好避免它们。您可以轻松地创建一个翻译存储层,并使用intl或其他任何格式。区域设置通常是有问题的线程,或者不是,只是全局的。最糟糕的是它会影响(字符串)$int的格式。
在哪里可以获得编译某些可选PHP扩展所需的库?对于线程安全扩展和非线程安全扩展的列表(*标记为非线程安全扩展和其他扩展)。
- 此列表适用于扩展,但不列出非扩展的线程不安全功能。如上述用户所述的setlocale。
一个更好的问题可能是,"如果使用MPM,下面的PHP代码会触发访问冲突吗?"或者,"您是否经历过可能归因于使用以下函数的并发性问题的奇怪行为?"
否则,就是俄罗斯轮盘赌。如果您使用的是一些打包的应用程序,那么它现在可能工作得很好,但从现在起一个月后,当新版本的应用程序出现时,它就会中断。
我强烈建议不要在PHP中使用MPM。但是,如果您有一些小代码要运行,您可以发布它,我们可以告诉您是否会遇到陷阱。
- 实际上,代码可能不是线程安全的,并且不会导致任何segfault/访问冲突。
- @瓦特克,是的,我编辑了我的答案。
- @Timpost,我不太明白你为什么说它是"俄罗斯轮盘赌"。如果代码确实是线程安全的,那么不管有多少并发线程在调用它,使用它都是安全的。即使你在"俄罗斯轮盘赌"上不走运(我想你指的是在每一步和所有可能最糟糕的地方并行线程交错),如果代码是线程安全的,我们也不会出错。