【问题标题】:Shell run/execute php script with parametersShell 运行/执行带参数的 php 脚本
【发布时间】:2011-10-09 11:46:33
【问题描述】:

我需要通过shell执行一个带参数的php文件。

这是我将如何运行 php 文件:

php -q htdocs/file.php

我需要传递参数'show'并且

php -q htdocs/file.php?show=show_name

没用

如果有人可以向我说明要执行什么命令以使用设置的参数执行 php 文件,那将不胜感激。如果没有,请尝试引导我正确的方向。

【问题讨论】:

标签: php shell parameters cron


【解决方案1】:

你需要从$argc$argv读取命令行参数。

使用问号是您在 URL 中执行的操作,与从命令行执行 PHP 无关。

另见:http://www.sitepoint.com/php-command-line-1/

【讨论】:

    【解决方案2】:

    test.php:

    <?php
    print_r($argv);
    ?>
    

    壳牌:

    $ php -q test.php foo bar
    Array
    (
        [0] => test.php
        [1] => foo
        [2] => bar
    )
    

    【讨论】:

    • 好的,所以我无法通过 php 中的 $_GET 而是通过 $argv 接收参数,谢谢。我花了一段时间才弄明白。
    【解决方案3】:

    除了其他答案(非常正确)之外,您还可以将参数作为环境参数传递,如下所示:

    FOO=42 BAR=quux php test.php
    

    然后它们将在超全局$_ENV 中可用。

    【讨论】:

    • 当我输入该命令时,我收到“FOO”错误。我在 Windows 上使用 xampp 的 shell 命令,这有什么改变吗?
    • 它可能无法在 Windows 上运行,但它可以在大多数 unix 类型的 shell 上正常运行。
    • 我让它工作了,我期待它被 PHP 的 $_GET[] 函数接收。我花了一段时间才意识到 $arvg 包含所有参数。谢谢。
    【解决方案4】:

    如果您从 PHP 文件中使用它,那么您可以使用 popen() 并执行以下操作:

    $part = $show_name; //or whatever you want with spaces
    
    $handle = popen("php -q nah.php -p=". escapeshellarg($part) . " 2>&1", "r");
    

    这使用了 escapeshellarg() 函数,以便将 $part 变量包裹在引号中(并转义其中的任何引号),以便它可以安全地用作 shell 参数。

    【讨论】:

      【解决方案5】:

      如果您有网络服务器(不仅安装了 php 解释器,还安装了 LAMP/LNMP/等)- 试试这个

      wget -O - -q -t 1 "http://mysite.com/file.php?show=show_name" >/dev/null 2>&1
      

      地点:

      • « -O - » —(字母“O”,而不是零!)将“下载的 html”重定向到标准输出
      • « >/dev/null 2>&1 » — 将 stdout 和 stderr 输出重定向到任何地方
      • « -q » — 安静 wget 运行
      • « -t 1 » - 只需 1 尝试连接(不像默认的 20)

      在 PHP 的“exec”中,它会是这样的:

      function exec_local_url($url) {
        exec('/usr/bin/wget -O - -q -t 1 "http://'. $_SERVER['HTTP_HOST'] .'/'
          . addslashes($url) . '" >/dev/null 2>&1'
        );
      }
      
      // ...
      
      exec_local_url("file.php?show=show_name");
      exec_local_url("myframework/seo-readable/show/show_name");
      

      因此,您无需更改脚本来处理 argc/argv,并且可以像往常一样使用 $_GET。

      如果您希望作业在后台运行 - 参见前。 Unix/Windows, Setup background process? from php code

      我在我的 cron 工作中使用 wget 方法;希望对您有所帮助。

      【讨论】:

      • 在使用exec 运行作业时,在安全性或性能方面,使用wgetphp 命令有什么区别吗?
      • 我确信安全性是一样的。性能 - 当然wget 会更慢,但就像上面所说的那样方便。使用 wget,请求会进入所有隐藏阶段或请求处理,如 apache/nginx/lighttpd 缓存、重写等。当直接致电php 时,您将责备如此复杂的解决方法,即它并非在所有情况下都适用。无论如何,我认为你必须把你目前的情况、你的大脑、基准测试工具,好好洗牌! ;)
      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 2013-06-13
      • 1970-01-01
      • 2012-01-15
      • 2016-12-18
      • 1970-01-01
      • 2016-07-02
      • 2014-01-25
      相关资源
      最近更新 更多