PHP 参数为 运行 的非交互式 SSH 会话脚本无法正常工作

PHP script with arguments run over non-interactive SSH session not working

我必须调用带参数的 PHP 脚本..

php /home/flintarm/www/store/magmi-importer/cli/magmi.cli.php -profile=Category -mode=create -logger=CLILogger

如果我使用 PuTTY 登录并进行交互式登录,这将非常有效。

我正在尝试从 SSIS 附加任务中调用此命令行。 (COZYROC SSH 执行任务,并不重要)这似乎是非交互式工作的。

当它运行时,它会启动 php 正常但忽略参数(所以它不正常)

下面是 PHP 来源..

<?php

/**
 * MAGENTO MASS IMPORTER CLI SCRIPT
 * 
 * version : 0.1
 * author : S.BRACQUEMONT aka dweeves
 * updated : 2010-08-02
 * 
 */

require_once(dirname(dirname(__FILE__))."/inc/magmi_defs.php");
require_once('magmi_loggers.php');
$script=array_shift($argv);

function buildOptions($argv)
{
    $options=array();
    foreach($argv as $option)
    {
        $isopt=$option[0]=="-";

        if($isopt)
        {
            $optarr=explode("=",substr($option,1),2);
            $optname=$optarr[0];
            if(count($optarr)>1)
            {
                $optval=$optarr[1];
            }
            else
            {
                $optval=1;
            }
            $options[$optname]=$optval;
        }
    }
    return $options;
}


function getClassInstance($cval,$cdir=".")
{
    $cdef=explode(":",$cval);
    $cname=$cdef[0];
    $cclass=$cdef[1];
    $cinst=null;
    $cfile="$cdir/$cname.php";
    if(file_exists($cfile))
    {
        require_once($cfile);
        if(class_exists($cclass))
        {
            $cinst=new $cclass();               
        }
    }
    if($cinst==null)
    {
     die("Invalid class definition : ".$cval);
    }
    return $cinst;

}

function getEngineInstance($options)
{
    if(!isset($options["engine"]))
    {
        $options["engine"]="magmi_productimportengine:Magmi_ProductImportEngine";
    }
    $enginst=getClassInstance($options["engine"],dirname(dirname(__FILE__))."/engines");
    return $enginst;
}

$options=buildOptions($argv);
$importer=getEngineInstance($options);
if(isset($importer))
{
    $loggerclass=isset($options['logger'])?$options['logger']:"FileLogger";
    $importer->setLogger(new $loggerclass());
    if(!isset($options["chain"]))
    {
        $options["chain"]=isset($options["profile"])?$options["profile"]:"";
        $options["chain"].=isset($options["mode"])?":".$options["mode"]:"";
    }
    $pdefs=explode(",",$options["chain"]);
    foreach($pdefs as $pdef)
    {
         $pm=explode(":",$pdef);
         $eargv=array();
         if(!empty($pm[0]))
         {
             $eargv[]="-profile=".$pm[0];
         }
         if(isset($pm[1]))
         {
            $eargv[]="-mode=".$pm[1];
         }
        $eoptions=buildOptions($eargv);
        $importer->run(array_merge($eoptions,$options));
    }
}
?>

我没有确切的 SSH 命令,因为它在 SSIS 组件的代码中。它生成的 "verbose" 日志显示:

2015-09-18 16:36:13.459 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_USERAUTH_SUCCESS (1 bytes).
 0000 |34                                             | 4
2015-09-18 16:36:13.459 DEBUG SshSession(1)[6] SSH: Authentication successful.
2015-09-18 16:36:13.459 VERBOSE SshSession(1)[6] SSH: Sending packet SSH_MSG_CHANNEL_OPEN (24 bytes).
 0000 |5A-00-00-00-07-73-65-73 73-69-6F-6E-00-00-00-00| Z....session....
 0010 |00-02-00-00-00-00-40-00                        | ......@.
2015-09-18 16:36:13.490 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_CHANNEL_OPEN_CONFIRMATION (17 bytes).
 0000 |5B-00-00-00-00-00-00-00 00-00-00-00-00-00-00-80| [...............
 0010 |00                                             | .
2015-09-18 16:36:13.490 DEBUG SshSession(1)[6] SSH: Executing command 'php /home/flintarm/www/store/magmi-importer/cli/magmi.cli.php -profile=Category -mode=create -logger=CLILogger'.
2015-09-18 16:36:13.490 VERBOSE SshSession(1)[6] SSH: Sending packet SSH_MSG_CHANNEL_REQUEST (128 bytes).
 0000 |62-00-00-00-00-00-00-00 04-65-78-65-63-01-00-00| b........exec...
 0010 |00-6E-70-68-70-20-2F-68 6F-6D-65-2F-66-6C-69-6E| .nphp /home/flin
 0020 |74-61-72-6D-2F-77-77-77 2F-73-74-6F-72-65-2F-6D| tarm/www/store/m
 0030 |61-67-6D-69-2D-69-6D-70 6F-72-74-65-72-2F-63-6C| agmi-importer/cl
 0040 |69-2F-6D-61-67-6D-69-2E 63-6C-69-2E-70-68-70-20| i/magmi.cli.php 
 0050 |2D-70-72-6F-66-69-6C-65 3D-43-61-74-65-67-6F-72| -profile=Categor
 0060 |79-20-2D-6D-6F-64-65-3D 63-72-65-61-74-65-20-2D| y -mode=create -
 0070 |6C-6F-67-67-65-72-3D-43 4C-49-4C-6F-67-67-65-72| logger=CLILogger
2015-09-18 16:36:13.537 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_CHANNEL_WINDOW_ADJUST (9 bytes).
 0000 |5D-00-00-00-00-00-20-00 00                     | ]..... ..
2015-09-18 16:36:13.537 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_CHANNEL_SUCCESS (5 bytes).
 0000 |63-00-00-00-00                                 | c....

当您启动非交互式会话时,会采用一组不同的启动脚本 运行 and/or 脚本中的不同路径(基于 TTY 变量)。

所以您的环境可能(很可能)不同。

这可能会影响 PHP 脚本的执行。在您的情况下,您可能没有 register_argc_argv enabled. So the $argv 未设置。

我建议您重写脚本,不要依赖非默认 PHP 设置。特别是使用 $_SERVER["argv"] 而不是 $argv.

或者将 phpinfo() 放在脚本的开头,运行 交互和非交互,看看是什么导致了 PHP 配置的差异。然后,更正您的启动脚本,为交互式和非交互式会话设置相同的 PHP 配置。


或者,如果您不想弄乱脚本,请将其放在最开头:

$argv = $_SERVER["argv"];