首页 > 解决方案 > 为什么我会丢失部分命令行参数?PHP/shell_exec

问题描述

我有一个 PHP 脚本,它获取“JSON 就绪”字符串的数据,并通过 shell_exec 将其通过命令行传递到 Windows 操作系统命令行。在另一端(这是一个 python 脚本),我通过 sys.argv 收集参数,出于调试目的,我将参数打印到一个简单的 .txt 文件中。当我检查该文件时,我注意到 PHP 脚本中我的参数的大约后半部分丢失了。在进行一些挖掘之后,我最初认为也许我在 PHP shell_exec 的函数或命令行本身中超出了某种字符限制。我的研究来自微软的这个页面:命令提示符(Cmd.exe)命令行字符串限制,指出命令行的字符限制为 2047 个字符。

我希望这将是我的问题,因为我可以解决它,但不幸的是我的命令字符串总共只有 1730 个字符。

我知道我可以将参数分块并单独发送块,或者将参数保存为文件并让我的python脚本以这种方式拾取它,但如果我在命令行的操作参数范围内,从某种意义上说这“应该”有效,那么我更愿意使用这种方法。更不用说我现在在 Windows 环境中为我们的应用程序的 Dev 版本工作,但是生产被推送到 Linux 服务器(我讨厌这个,但不幸的是我无法控制这些因素)。在我们的生产 Linux 发行版上,它可以工作并使用这个命令行进程。

这是我的命令行代码:

$cmd = "python C:\\xampp\\htdocs\\app\\pages\\plot\\python\\plotfunction.py " .$data;
$output = shell_exec($cmd .' 2>&1 &');

$data 是一个类似 json 的字符串,包含 1653 个字符。

读取 sys.argv 的 python 是这样的:

ATP_CHART_SPEC_json = sys.argv[1].replace("$", '"')

当我将 ATP_CHART_SPEC_json 保存到一个文件中时,它只包含 750 个字符。我失去了一半多一点的论点。

笔记:

我使用 python 中的 .replace 来克服以下问题:显然,当通过命令行发送字符串作为参数时(或由于我不知道的其他原因)我丢失了所有的 '"' 字符,当他们'在python中使用“”转义成为一个问题。所以在PHP中我暂时用$替换所有引号并在传输后将它们替换回来。我已经验证这不会(通常)损坏JSON字符串的完整性。

标签: pythonphpcmd

解决方案


推荐阅读