我有一个专门用于处理大量数据的服务器。我现在拥有它的方式,我可以使用像example.php?ex_pid=123
这样的进程ID打开一个脚本,然后放手。它会下载一小部分数据,对其进行处理,然后将其上传到数据库中,然后重新开始。
理想情况下,我想直接调用example.php?ex_pid=123
而不是将变量传递给像exec('./example.php'.' '.EscapeShellArg($variable));
这样的example.php,以防止它在全局范围内行动。
我不关心输出,如果它可以在后台执行,那就太棒了。该服务器是一个Ubuntu发行版btw。
这甚至可能吗?如果是这样,那么任何帮助和例子都会受到更多的赞赏。
答案 0 :(得分:1)
您可以执行以下操作:
exec("./example.php '".addslashes(serialize($_GET))."');
然后在example.php中执行以下操作:
count($_GET) == 0 && $_GET = unserialize(stripslashes($_SERVER['argv'][1]))
答案 1 :(得分:0)
主要问题是?ex_pid是GET数据,通常与包含文件或通过浏览器访问文件相关联。如果您包含该文件或从Web浏览器访问它,这将是微不足道的,但将其作为CLI运行,不幸的是,您唯一的选择是将其作为参数传递。您可以将其作为ex_pid = 123传递并仅解析该数据,但它仍然需要作为参数传递,但这样做可以使用parse_str()来解析它。
根据脚本的作用,您可以调用lynx来调用附加了get数据的实际页面,并为运行它所需的apikey生成一个哈希值。不确定这是否是一个选项,但它是另一种方式来做你想要的。
希望有所帮助!
答案 2 :(得分:0)
我遇到了一个真正的问题,无法让它运行像example.php?variable = 1。
但是我可以使用exec命令运行单个文件,但最后没有?variable = 1。
我决定做的是根据我想发送的变量动态更改模板文件的内容。此文件名为template.php,包含通常作为$ _GET运行的所有代码。而不是使用$ _GET,将变量的值设置在顶部。然后搜索这行代码并替换为您选择的任何值。
然后我保存了这个新文件并改为运行。
在下面的示例中,我需要更改SQL查询 - 模板文件包含$ sql =“Enter SQL CODE HERE”行。我还需要在顶部更改变量的值。 template.php中的行是$ myvar = 999999;下面的代码将template.php中的这些行更改为新值。
//Get the base file to modify - template.php
$contents=file_get_contents("template.php");
$sql="SELECT * FROM mytable WHERE foo='".$bar."'";
$contents=str_replace("ENTER SQL CODE HERE",$sql,$contents);
//Another search
$contents=str_replace("999999",$bar,$contents);
$filename="run_standalone_code".$bar.".php";
//If the file doesnt't exist, create it
if(!file_exists($filename)){
file_put_contents($filename, $contents);
}
//Now run this file
$cmd="/usr/local/bin/php ".$filename." >/dev/null &";
exec($cmd);
答案 3 :(得分:0)
在@Andrew Waugh评论之前我完全忘记了这个问题(我收到了一封电子邮件提醒)。
无论如何,这个问题源于对使用CLI时如何将$ argv数组传递给脚本的误解。您可以根据需要使用尽可能多的参数。我现在实现这一目标的方式如下:
if (isset($argv)) {
switch ($argv[1]) {
case "a_distinguishing_name_goes_here":
$pid = $argv[2];
sample_function($pid);
break;
case "another_name_goes_here":
do_something_else($argv[2]);
break;
}
}