问题背景
PHP通过exec调用通过Cython编译的Python脚本时,Python返回值为1,且不给出输出。
问题原因
PHP通过nginx的php-fpm执行时,nginx的运行用户非平时登陆的用户,导致用户环境变量的字符集不是UTF-8,而是ascii
编码。通过locale
命令即可查看。
解决办法
在执行exec命令前追加:参考资料
putenv('LANG=en_US.UTF-8');
排查过程
让PHP调用通过python解释器直接执行py,命令行追加 2>&1输出标准错误。
<?php
$cmd = '/usr/bin/python3.6 /usr/local/test_cmd.py -i 2>&1';
exec($cmd, $out, $ret);
var_dump($out);
var_dump($ret);
会发现python输出的错误为
UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range
由于python输出时使用了非标准ascii字符,例如中文等,可以说明是系统字符集导致的该问题。
接下来通过php的exec在web和命令行方式,分别执行locale
命令,会发现两者个给出的字符集不同。一个为en_US.UTF-8'
,另一个为POSIX
,确认问题所在。