我必须调用带有参数的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组件的代码中。它产生的“详细”日志显示了这一点:
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....
当您启动非交互式会话时,将运行一组不同的启动脚本和/或采用脚本中的不同路径(基于TTY
变量)。
所以你的环境可能(很可能确实)有所不同。
这可能会影响PHP脚本的执行。在您的情况下,您可能没有启用register_argc_argv
。所以$argv
没有设定。
我建议你重写你的脚本,不要依赖非默认的PHP设置。特别是使用$_SERVER["argv"]
而不是$argv
。
或者将phpinfo()
放在脚本的开头,以交互方式和非交互方式运行它,并查看导致PHP配置差异的原因。然后,更正启动脚本,为交互式和非交互式会话设置相同的PHP配置。
或者,如果你不想搞乱脚本,那就把它放在最开头:
$argv = $_SERVER["argv"];