通过 php 运行的 python 脚本(cli 和 mod-php 差异)

问题描述 投票:0回答:1

这里通过 apache mod-php 运行 python 脚本有一些困难

fname='/tmp/catalog.xml'
http=urllib3.PoolManager()
response=http.request('GET','https://xxxx/xxxxx.xml')
doc=response.data.decode('UTF-8')
print('Saving xml...')
with open(fname,'w') as catalog:
    catalog.write(doc)
print('Parsing...')

此代码从 php 脚本执行,当我从 cli 执行它时完美运行:

sudo -u www-data php -f test.php
,在 tmp 目录中出现文件catalog.xml,其中包含数据。但是当我通过网络浏览器执行相同的 php 脚本时,执行字符串“正在保存 xml...”的结果是 tmp 目录中的空文件catalog.xml。不知何故,数据没有写入文件,但它创建了

所有权限都是正确的,文件创建但它是空的,php 日志文件中根本没有错误

python php apache command-line-interface
1个回答
0
投票

当您从 Web 浏览器通过 Apache 的 mod-php 运行 Python 脚本时,有几个因素可能会导致您所描述的问题。您可以采取以下一些步骤来诊断并可能解决问题:

检查Web服务器环境:

确保 Web 服务器(例如 Apache)有权写入 /tmp 目录。您可能需要专门向运行 Apache 的用户授予写入权限(在许多 Linux 发行版上通常为 www-data)。您可以使用 chmod 命令来执行此操作。

sudo chmod 777 /tmp

验证通过 Web 浏览器访问时 PHP 脚本是否以与从命令行执行时相同的用户身份运行(在您的情况下为 www-data)。这可能很重要,因为两种执行方法之间的文件权限和环境变量可能不同。

检查 PHP 配置:

确保您没有遇到任何 PHP 执行限制或超时。如果长时间运行的脚本超出配置的限制,PHP 可能会终止它们。您可以检查 PHP 配置中的这些限制,例如 max_execution_time、memory_limit 和 post_max_size。 检查错误:

既然您提到 PHP 日志文件中没有错误,请考虑在 PHP 脚本中添加错误处理以捕获可能未记录的任何潜在问题。例如,使用 try-catch 块捕获异常并将其记录到文件中。

try {
    // Your Python script here
} catch (Exception $e) {
    error_log('Error: ' . $e->getMessage(), 0);
}

此外,您可以通过在 Python 代码周围添加错误处理来检查 Python 脚本本身中的错误,例如检查 with open() 的返回值并记录任何错误。

调试:

将调试语句添加到 PHP 脚本中以帮助缩小问题范围。例如,在解码响应后打印出 doc 变量的值,以确保它包含预期的数据。

echo 'Response Data: ' . $doc;

您还可以使用 PHP 中的 error_log 函数来记录自定义消息,以帮助您跟踪脚本的执行路径。

环境变量:

验证 Python 脚本在 Web 服务器上运行时所需的环境变量是否已正确设置。 CLI 和 Web 服务器环境之间的环境变量可能有所不同。您可以在 PHP 中使用 getenv() 来检查环境变量的值。

echo 'Python Path: ' . getenv('PATH'); // Check the PATH variable

SELinux 或 AppArmor:

如果您使用 SELinux 或 AppArmor,请确保这些安全模块不会阻止 Apache 进程写入 /tmp 目录。 通过系统地检查这些因素,您应该能够查明问题并解决它。请谨慎更改权限,并确保在故障排除后正确保护您的 Web 服务器。

© www.soinside.com 2019 - 2024. All rights reserved.