提问人:user3212640 提问时间:10/26/2023 最后编辑:XMehdi01user3212640 更新时间:10/26/2023 访问量:50
通过 PHP 运行的 Python 脚本(CLI 和 mod-php 的区别)
python script running through php (cli and mod-php differences)
问:
这里通过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执行它时可以完美地工作:,在TMP目录中出现文件目录.xml,其中包含数据。但是当我通过Web浏览器执行相同的PHP脚本时,结果只是执行字符串“保存xml...”,并在tmp目录中空文件catalog.xml。不知何故,数据没有写入文件中,但它创建了sudo -u www-data php -f test.php
所有permissoins都是正确的,文件创建但为空,PHP日志文件中根本没有错误
答:
当您从 Web 浏览器通过 Apache 的 mod-php 运行 Python 脚本时,有几个因素可能导致您描述的问题。以下是诊断并可能解决问题的一些步骤:
检查 Web 服务器环境:
确保 Web 服务器(例如 Apache)有权写入 /tmp 目录。您可能需要专门向运行 Apache 的用户授予写入权限(在许多 Linux 发行版上通常为 www-data)。您可以使用 chmod 命令执行此操作。
sudo chmod 777 /tmp
验证 PHP 脚本在通过 Web 浏览器访问时是否以相同的用户身份运行,以及从命令行(在本例中为 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 服务器运行时是否正确设置了 Python 脚本所需的环境变量。CLI 和 Web 服务器环境之间的环境变量可能不同。您可以在 PHP 中使用 getenv() 来检查环境变量的值。
echo 'Python Path: ' . getenv('PATH'); // Check the PATH variable
SELinux 或 AppArmor:
如果您使用的是 SELinux 或 AppArmor,请确保这些安全模块不会阻止 Apache 进程写入 /tmp 目录。 通过系统地检查这些因素,您应该能够查明问题并解决它。更改权限时要小心,并确保在故障排除后正确保护您的 Web 服务器。
评论
我们可以尝试在那里添加一些错误处理吗?看看在绝望中是否会发生什么?
喜欢:
fname='/tmp/catalog.xml'
http=urllib3.PoolManager()
response=http.request('GET','https://xxxx/xxxxx.xml')
doc=response.data.decode('UTF-8')
print('Saving xml...')
try:
with open(fname,'w') as catalog:
catalog.write(doc)
except Exception as e:
print(e)
问题解决了。这是编码问题。很奇怪的是,它在 CLI 中运行良好,而在 mod-php 中则不然。我只是添加 encoding='utf-8'
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',encoding='utf-8') as catalog:
catalog.write(doc)
print('Parsing...')
它有效!
评论