【问题标题】:How to capture output from PHP extension when using PHP-FPM使用 PHP-FPM 时如何从 PHP 扩展中捕获输出
【发布时间】:2018-07-18 18:25:39
【问题描述】:

我在我的 PHP 中加载了一个自定义 C 扩展,并且在扩展内部有一个函数可以执行类似的操作

void a() {
    printf("abc");
}

我可以在 CLI 模式(命令行)下毫无问题地调用 a(),并按预期得到输出 abc。但是当我在我们的 Yii 项目中以 PHP-FPM 模式再次尝试时,我无法得到那个输出。

我确定的是:

  • 扩展已加载。
  • 函数调用成功,没有错误。
  • PHP 输出缓冲已关闭。我在调用a()之前调用了两次ob_end_clean(),第一次调用返回true,第二次返回false

所以我的问题是:

我应该在 PHP-FPM 模式下从扩展中获取输出吗?

如果是这样,我该如何捕获输出,或者请给我一些调试建议。

【问题讨论】:

  • 当您说“我确定的是:- 扩展程序已加载。”你的意思是你已经在你的 yii 项目下的一个网页上回显了 phpinfo 并找到了你的扩展。
  • @KamalSoni 是的。实际上,扩展中有几个功能。除了我无法获得printf 输出的问题之外,它们在 Yii 项目中都工作正常
  • 好的很好@Lution我认为你可以通过做几件事来调试它可能会对你有所帮助。 1)首先,我认为您的 printf 函数签名看起来不正确。它应该只有一个或多个参数。可以尝试打印。 2) 创建 void b() {printf("abc");} 并查看是否得到任何调用 b 而不是 a 的内容。同样在每次更改后,值得重新启动 php-fpm。

标签: php php-extension


【解决方案1】:

当 PHP 作为 webserver 模块运行时,stdout 被重定向到最初启动 webserver 进程的终端。在生产服务器上,这样的终端未激活,因此您发送到 stdout 的任何输出都将丢失。

尝试使用 php_printf() 函数代替 printf() 一个

或许这篇文章能帮到你https://devzone.zend.com/317/extension-writing-part-ii-parameters-arrays-and-zvals/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2013-10-23
    相关资源
    最近更新 更多