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输出标准错误。
&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,确认问题所在。



