php - 为什么从 PHP 调用的长时间运行的 Python 脚本会失败

标签 php python laravel shell-exec laravel-queue

我有一个转换 PDF 文件的 Python 脚本。它在我的 Laravel 应用程序中通过 PHP 调用:

$command = escapeshellcmd("python /home/forge/default/pdf.py " . $id);
$output = shell_exec($command);

这适用于任何高达 250MB 的 PDF,但不适用于更大的 PDF,例如 500Mb。

如果我直接从命令行调用 Python 脚本,它工作正常并在大约 5 分钟内完成。只有当被 shell_exec 调用时才会失败。

这是在 Laravel 排队作业中发生的,据我所知不是使用 HTTP/PHP FPM,而是命令行,应该没有超时?

Laravel 队列工作线程正在运行,超时设置为 0(无超时)。

在 PHP CLI 设置中是否还有其他可能导致此失败的内容? 是否知道错误将被记录在何处 - failed_jobs 表中没有任何内容, laravel.log,我的 Bugsnag 集成没有捕获任何内容。

由于它从命令行运行正常,我猜这不是 Python 问题,而是与从 PHP 调用它有关。

服务器有 60Gb 的 RAM,通过 htop 观察进程,它从未超过 3% 的 RAM 使用率。是否还有其他一些硬编码的 RAM 限制?

我正在使用 Laravel 5.4、Ubuntu 服务器、Python 2.7.12。

最佳答案

因为脚本有执行时间和内存限制,可以在php.ini中查看。通常是 max_execute_time = 30s。和内存限制默认128M

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 300

和内存限制

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 1280M

关于php - 为什么从 PHP 调用的长时间运行的 Python 脚本会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44041958/

相关文章:

php - Jeditable 新值不会保存到数据库

python - AUC 与 GridSearchCV AUC 有何不同?

python - 内部函数(python)的文档字符串是否必要?

php - 如何在 Laravel 中使用主密码登录用户?

laravel - 如果 Laravel 中存在图像,如何避免编辑表单中需要图像?

php - PHP 中是否有类似 json_encode() 的 xml_encode()?

php - not null if 语句的最佳实践

php - 从像素数组创建图像服务器端

python - GIL 如何处理分块 I/O 读/写?

mysql - 将 Controller 在 Blade 文件中获取的值传递给查询