通过 PHP 运行的 Python 脚本(CLI 和 mod-php 的区别)

python script running through php (cli and mod-php differences)

提问人:user3212640 提问时间:10/26/2023 最后编辑:XMehdi01user3212640 更新时间:10/26/2023 访问量:50

问:

这里通过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日志文件中根本没有错误

python php apache 命令行界面

评论


答:

0赞 Ivan Campelo 10/26/2023 #1

当您从 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 服务器。

评论

0赞 Nigel Ren 10/26/2023
你是否在使用某种人工智能来写这些答案?
0赞 Ivan Campelo 10/26/2023
不,我正在尝试解锁我的 stackoverflow 帐户,并且我试图让它尽可能详细以符合他的标准,这样我就可以回去提问了。
0赞 user3212640 10/26/2023
所有权限都很好,如果文件是创建的但为空的,它会在其他地方显示该问题/我正在尝试追踪问题的确切位置,当我打印(http)时,它只显示我什么也没有,但应该像0x7f8559df1198>的<urllib3.poolmanager.PoolManager对象,所以问题是该模块没有导入,但为什么没有错误?为什么它没有在php-mod下导入?
0赞 Ivan Campelo 10/26/2023
你们的模块版本如何?我最近在我的 Django 项目中解决了一个巨大的问题,更新了我所有的库。
0赞 Ivan Campelo 10/26/2023
它还会检查您用于导入的路径是否为绝对路径,是否缺少任何内容。
0赞 Ivan Campelo 10/26/2023 #2

我们可以尝试在那里添加一些错误处理吗?看看在绝望中是否会发生什么?

喜欢:

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)
1赞 user3212640 10/26/2023 #3

问题解决了。这是编码问题。很奇怪的是,它在 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...')

它有效!

评论

0赞 Olivier 10/26/2023
可能与:stackoverflow.com/questions/73118543/...