如何在CLI中加载pthreads扩展?

时间:2016-02-04 12:28:34

标签: php apache pthreads

我在MAC OSX 10.11上从源代码构建了php和Apache。

我在CLI中加载pthreads扩展时遇到了麻烦。我误解了如何加载它,现在我真的不明白我应该怎么做。

这是我到目前为止所做的。

我使用以下命令配置了php:

0

Apache加载的模块:

'./configure' 
'--prefix=/Users/username/Terminal/WebServer'
'--with-apxs2=/Users/username/Terminal/WebServer/bin/apxs'
'--enable-maintainer-zts' 
'--enable-pthreads=shared' 
'--enable-debug' 
'--with-tsrm-pthreads' 
'--with-config-file-path=/Users/username/Terminal/WebServer/ini' 
'--enable-cli'

所以,在/ Users / username / Terminal / WebServer / ini目录下我创建了Compiled in modules: core.c mod_so.c http_core.c worker.c 文件并添加了php-cli.ini行,然后我运行了extension=pthreads.so命令,以下是输出:

php -m

我重新启动了Apache并打开了[PHP Modules] Core ctype date dom fileinfo filter hash iconv json libxml pcre PDO pdo_sqlite Phar posix <strong>pthreads</strong> Reflection session SimpleXML SPL sqlite3 standard tokenizer xml xmlreader xmlwriter [Zend Modules] 文件,其中包含index.php 值得注意的信息

phpinfo()
Configuration File (php.ini) Path => /Users/username/Terminal/WebServer/ini
Loaded Configuration File => /Users/username/Terminal/WebServer/ini/php.ini
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)

Thread Safety => Enabled不包含pthreads模块信息,我不知道是否应该这样做。
此时我打开test.php文件,其中包含以下pthreads脚本:

phpinfo()

,通过apache的输出是:

<?php $thread = new class extends Thread { public function run() { echo "Hello World\n"; } }; $thread->start() && $thread->join(); ?>


当我在终端上运行以下命令时 Fatal error: Class 'Thread' not found in /Users/username/Sites/test.php on line 1

输出为: Hello World

所以问题是如何在CLI中正确加载pthreads扩展?

1 个答案:

答案 0 :(得分:2)

你已经有了预期的结果,但似乎不知道为什么......

您的配置的关键部分是:

// sanity check assert(alloc.find("a") != alloc.end()); for (auto iter = alloc["a"].begin(); iter != alloc["a"].end(); ++iter) { cout << *iter << endl; } 选项

如果使用Apache DSO SAPI构建PHP,则必须使用configure,这会导致构建过程从pthreads库创建DSO(共享对象,windows中的dll),而不是静态链接pthreads进入Apache DSO。

--enable-pthreads=shared配置

来自PHP manual

  

如果存在php-SAPI.ini(其中SAPI是正在使用的SAPI,例如,php-cli.ini或php-apache.ini),则使用它而不是php.ini。可以使用php_sapi_name()确定SAPI名称。

建立共享pthreads(pthreads.so)之后,我们可以在与php.ini相同的路径中创建php-cli.ini并向其添加php.ini

你有什么作品,然而,它并不理想;你真的不希望Apache使用具有ZTS开销的PHP解释器。

理想情况下,您需要构建和安装PHP两次:

First Build

extension=pthreads.so configure --with-apxs=... --disable-pthreads --prefix=/system/prefix ...

--with-config-file-path=/system/prefix/etc替换为合理的系统前缀,例如/system/prefix/ ...

当您/usr/进行此构建时,您将为Apache创建理想的安装,其中包括make install的非线程安全PHP二进制文件,以及所有相关脚本(/system/prefix/bin/php,{ {1}},pecl等。phpize

第二次构建

在此构建之前,您需要php-config(如果您使用的是发布tarball)或/system/prefix/bin(如果您使用的是本地git存储库)。

make clean ...

vcsclean替换为合理的特殊前缀configure --enable-maintainer-zts --enable-pthreads=static --prefix=/special/prefix --with-config-file-path=/special/prefix/etc,不要使用与第一次构建相同的前缀...

当您/special/prefix/没有触及第一次安装时,会创建一个不支持Apache的新安装,但支持pthreads静态构建到二进制文件中(免费配置)。

二进制文件位于/opt/,所有相关脚本都在make install

布线一起构建

如果两个版本都需要相同的PECL扩展(pthreads除外),则可以对两个版本使用相同的/special/prefix/bin/php配置开关。

如果你真的很勇敢,你也可以使用相同的/special/prefix/bin开关,但这可能会产生不希望的结果。

为两个版本编辑--with-config-file-scan-dir也会有所帮助。