使用pecl安装apd时,在运行phpize时出现“找不到config.m4”的错误。

13

我正在尝试在PHP中获取rename_function的访问权限,为此我需要PECL APD。我使用Ubuntu 14.04 LTS。

我正在尝试运行sudo pecl install apd,但我得到了以下错误:

downloading apd-1.0.1.tgz ...
Starting to download apd-1.0.1.tgz (36,643 bytes)
..........done: 36,643 bytes
15 source files, building
running: phpize
Cannot find config.m4.
Make sure that you run '/usr/bin/phpize' in the top level source directory of
the module

If the command failed with 'phpize: not found' then you need to install php5-dev package. You can do it by running 'apt-get install php5-dev' as a root userERROR: `phpize' failed

我应该从特定目录运行此命令吗?

这次我尝试打开详细选项,以便日志中有线索:

sudo /usr/bin/pecl -vvvvv install apd
Warning: file_exists(): Unable to find the wrapper "channel" - did you forget to enable it when you configured PHP? in PEAR/Downloader/Package.php on line 1518
Warning: is_file(): Unable to find the wrapper "channel" - did you forget to enable it when you configured PHP? in PEAR/Downloader/Package.php on line 1528
Warning: is_file(): Unable to find the wrapper "channel" - did you forget to enable it when you configured PHP? in PEAR/Downloader/Package.php on line 1528 Downloading "http://pecl.php.net/get/apd-1.0.1.tgz" downloading apd-1.0.1.tgz ... Starting to download apd-1.0.1.tgz (36,643 bytes) ..........done: 36,643 bytes + cp /tmp/pear/temp/tmpNUpEpz/apd-1.0.1/LICENSE /usr/share/php/doc/apd/.tmpLICENSE adding to transaction: chmod 664 /usr/share/php/doc/apd/.tmpLICENSE
添加到事务:重命名 /usr/share/php/doc/apd/.tmpLICENSE 为 /usr/share/php/doc/apd/LICENSE 添加到事务:安装为 LICENSE /usr/share/php/doc/apd/LICENSE /usr/share/php/doc/apd + 将 /tmp/pear/temp/tmpNUpEpz/apd-1.0.1/README 复制到 /usr/share/php/doc/apd/.tmpREADME 添加到事务:将 /usr/share/php/doc/apd/.tmpREADME 的权限更改为 664 添加到事务:重命名 /usr/share/php/doc/apd/.tmpREADME 为 /usr/share/php/doc/apd/README 添加到事务:安装为 README /usr/share/php/doc/apd/README /usr/share/php/doc/apd + 将 /tmp/pear/temp/tmpNUpEpz/apd-1.0.1/pprofp 复制到 /usr/bin/.tmppprofp + 将 /usr/bin/.tmppprofp 的权限更改为可执行 添加到事务:将 /usr/bin/.tmppprofp 的权限更改为 775 添加到事务:重命名 /usr/bin/.tmppprofp 为 /usr/bin/pprofp 添加到事务:安装为 pprofp /usr/bin/pprofp /usr/bin/ + 将 /tmp/pear/temp/tmpNUpEpz/apd-1.0.1/pprof2calltree 复制到 /usr/bin/.tmppprof2calltree + 将 /usr/bin/.tmppprof2calltree 的权限更改为可执行 添加到事务:将 /usr/bin/.tmppprof2calltree 的权限更改为 775 添加到事务:重命名 /usr/bin/.tmppprof2calltree 为 /usr/bin/pprof2calltree 添加到事务:安装为 pprof2calltree /usr/bin/pprof2calltree /usr/bin/ 15 个源文件,正在构建中 正在构建于 /tmp/pear/temp/pearf7LGca 正在执行:phpize 找不到 config.m4 文件。 请确保在模块的顶级源目录中运行 '/usr/bin/phpize' 命令
如果命令返回 'phpize: not found',则需要以 root 用户身份安装 php5-dev 包。可以通过运行 'apt-get install php5-dev' 来实现。回滚了 12 个文件操作 + 删除 /usr/share/php/doc/apd/.tmpLICENSE + 删除 /usr/share/php/doc/apd/.tmpREADME+ rm /usr/bin/.tmpprofp + rm /usr/bin/.tmppprof2calltree 错误: `phpize' 失败
警告:在 System.php 的 214 行,unlink(/tmp/glibctestRdKE0K) 没有找到该文件或目录。
警告:在 System.php 的 214 行,unlink(/tmp/pear/temp/pearf7LGca) 没有找到该文件或目录。

3
你有没有注意到错误信息的最后一行?它告诉了你可能的解决方案。 - Marc B
我已经成功执行了“apt-get install php5-dev”,并且在/usr/bin中存在phpize。然而,我不理解“确保在模块的顶级源目录中运行'/usr/bin/phpize'”这句话的意思。 - Anthony
2个回答

17
这是一份运行APD作为PHP分析器的前提条件的简短摘要,希望能满足您的需求。此摘要适用于PHP 5.6.2 APD 1.0.1版本,对其他版本可能不正确。
首先,请确保以下两点:
- 停用Zend平台或任何其他PHP优化器。通常需要禁用所有Zend扩展。 - 安装启用调试的PHP版本(--enable-debug)。
如果您有一个可工作的PEAR设置,您需要像这篇文章中所述设置APD。别忘了尝试发行包。否则,按照以下步骤构建APD:
- 解压tarball。 - 进入tarball目录。 - 运行<apache root>/bin/phpsize - 运行./configure(如果configure失败,请添加--with-php-config=<apache root>/bin/php-config) - 使用以下命令编译和安装所有内容:
make
make install
- 编辑php.ini并至少添加以下内容:
zend_extension=/apd.so
apd.statement=1
apd.tracedir=/tmp/apd-traces
- 创建php.ini中指定的输出目录。
现在,您需要重新启动Apache,但在此之前,请检查APD扩展是否正常工作。只需运行PHP:
/bin/php
如果扩展正确加载,不应出现任何警告。如果您收到类似于无法加载“apd.so”扩展的错误消息,则存在问题。检查是否针对正确的Apache/PHP版本进行编译并使用相同的版本。如果PHP没有任何抱怨,请输入:
<?php phpinfo(); ?>

检查一下是否有关于APD的代码行,如果有则完成了。

您还需要一些跟踪信息,因此要开始跟踪,您需要让Apache允许PHP模块加载APD。接下来,您需要确定要跟踪的脚本。在脚本顶部添加APD调用:

apd_set_pprof_trace();

然后发出一些请求并再次删除语句,以避免造成进一步的伤害。 现在查看跟踪目录。你应该在这里找到命名方案为pprof[0-9]*.[0-9]的文件。使用你的APD源tarball中的pprofp工具对它们进行解码。例如:

/bin/php /pprofp -u 

必要时重定向标准输出。使用-t而不是-u(摘要输出)来获取调用树。当您创建带有-t的跟踪时,您也会得到一个摘要输出,但它不包含每个调用的持续时间。我建议始终创建调用树和摘要跟踪。

希望这可以帮助你,我强烈推荐你阅读上面提到的链接。

编辑:

phpize命令旨在在扩展源目录的顶层运行(此源目录应包含名为config.m4的文件)。有关更多信息,请参见此处


2
谢谢你的这篇文章!我阅读了有关APD的文章,它听起来很容易安装,但是我没有成功。我解压了http://pecl.php.net/get/apd-1.0.1.tgz,对其运行了phpize(可以正常工作),并运行了configure。但是当我运行“make”或“make install”时,我得到了几页错误,如“/usr/include/php5/Zend/zend_globals_macros.h:37:33:error:'struct _zend_compiler_globals'没有名为'extended_info'的成员# define CG(v)(compiler_globals.v)”。 我不认为Zend平台已安装。 如何安装启用调试的PHP版本?(我的版本不提供--enable debug) - Anthony
我只是猜测,因为你的错误信息只有一行,所以如果你使用了 function_entry,那么请将其更改为 zend_function_entry,因为在 PHP 5.4 中已经删除了 function_entry。错误信息显示 APD 无法在你的 PHP 版本上编译。这里有一个补丁可以解决你的问题。如果你的 PHP 版本不允许你进行调试,请尝试安装 DBG。希望能帮到你。 - balintpekker
1
给未来的朋友们:我成功地使用这个补丁构建了apd1.0.1并兼容php5.4。 - Jokester
@Jokester 我已经在 PHP 5.6 中使用了这个补丁,但是出现了像这样的错误。php_apd.c:984:23: error: expected expression before '=' token CG(compiler_options) = CG(compiler_options) | ZEND_COMPILE_EXTENDED_INFO; 你有任何解决方法吗? - Michal Olszowski
@MichalOlszowski 这个补丁是针对5.6.2版本的,可能5.6版本无法编译CG(extended_info) = 1;,所以请将补丁中的那一行改为:CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;,然后再运行补丁。(它位于补丁文件末尾的“Zend扩展函数”部分下。)希望这样能解决问题! - balintpekker

0
根据错误提示:
如果命令失败并显示“phpize: not found”,则需要安装php5-dev包。
您可以通过以root用户身份运行“apt-get install php5-dev”来完成安装。
我认为您应该通过以下方式安装PHP的模块开发:
sudo apt-get install php5-dev

这将为您提供编译Pecl扩展源代码所需的phpize二进制文件。并确保它在您的PATH中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接