php - 使用 PHP-FPM 时如何捕获 PHP 扩展的输出

标签 php php-extension

我在我的 PHP 中加载了一个自定义的 C 扩展,在扩展中有一个函数执行类似这样的操作

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

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

我确定的是:

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

所以我的问题是:

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

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

最佳答案

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

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

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

关于php - 使用 PHP-FPM 时如何捕获 PHP 扩展的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48681163/

相关文章:

java - 错误 org.json.JSONObject 无法转换为 JSONArray

php - 每次我尝试安装 php-mysqli 扩展时,我都会收到类似 "E: Package ' php-mysqli' has no installation candidate 的错误消息”

php - php 扩展内的方法调用出现段错误

php - WAMPSERVER php_memcache 扩展

php - 如何安装 ITL 扩展

php - $this 关键字是什么意思?

javascript - 将多个对象作为 1d 传递到数组中

php - 如何在 Azure 网站上安装 ionCube?

php - laravel包中路由声明的顺序

php - MySql中多次更新一个字段