我在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扩展?
答案 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两次:
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
也会有所帮助。