这里通过 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 日志文件中根本没有错误
当您从 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 服务器。