【问题标题】:passing URL variables to exec() with php使用 php 将 URL 变量传递给 exec()
【发布时间】:2010-07-26 21:22:45
【问题描述】:

我有一个专用服务器来处理大量数据。按照我现在的方式,我可以打开一个进程 ID 为 example.php?ex_pid=123 的脚本,然后放手。它会下载一小部分数据,对其进行处理,然后将其上传到数据库中,然后重新开始。

理想情况下,我想直接调用example.php?ex_pid=123,而不是像exec('./example.php'.' '.EscapeShellArg($variable)); 那样将变量传递给example.php,以防止它在全局范围内起作用。

我不关心输出,如果它可以在后台执行,那就太好了。顺便说一句,服务器是一个 Ubuntu 发行版。

这甚至可能吗?如果是这样,任何帮助和示例将不胜感激。

【问题讨论】:

    标签: php linux ubuntu exec


    【解决方案1】:

    你可以这样做:

    exec("./example.php '".addslashes(serialize($_GET))."');
    

    然后在 example.php 中执行如下操作:

    count($_GET) == 0 && $_GET = unserialize(stripslashes($_SERVER['argv'][1]))
    

    【讨论】:

    • 这是一种非常老套的方法。一方面,它是escapeshellarg() 而不是addslashes()
    【解决方案2】:

    主要问题是 ?ex_pid 是 GET 数据,通常与包含文件或通过浏览器访问文件相关联。如果您要包含该文件或从 Web 浏览器访问它,这将是微不足道的,但将其作为 CLI 运行,您唯一的选择是将其作为参数传递,不幸的是。您可以将其作为 ex_pid=123 传递并仅解析该数据,但仍需要将其作为参数传递,但您可以使用 parse_str() 对其进行解析。

    根据脚本的作用,您可以调用 lynx 来调用附加了获取数据的实际页面,并为使其运行所需的 apikey 生成哈希。不确定这是否是一种选择,但它是另一种方式来做你想要的。

    希望有帮助!

    【讨论】:

      【解决方案3】:

      我遇到了一个真正的问题,无法让它运行像 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);
      

      【讨论】:

        【解决方案4】:

        在@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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-20
          • 2017-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多