【问题标题】:Keep shell open with PHP to allow multiple calls?使用 PHP 保持 shell 打开以允许多次调用?
【发布时间】:2009-10-19 14:47:41
【问题描述】:

如何让 shell 会话保持打开状态,直到我用 PHP 关闭它?

在我的示例中,我想使用 NcFtp 通过 shell 命令发布一些文件。我想保留 PHP 内置的 FTP,因为它要慢得多,而且性能是个问题。

使用ncftpput 发布文件或目录很容易。但是,如果我想遍历一个包含 10 个文件的数组,脚本将不得不登录、发布、注销、登录、发布、注销……

如果有这样的方法会更方便。

shell_exec('ncftp -u username -p password');

foreach ( $files as $file )
{
    shell_exec('put '.$file['local_path'].' '.$file['remote_path']);
}

shell_exec('quit');

有可能吗?

谢谢!

【问题讨论】:

  • 看看expect:expect.nist.gov
  • 你不能在 ncftp 中嵌套命令,对吧?喜欢:ncftp -u 用户名 -p 密码 && put ... && put...

标签: php unix shell


【解决方案1】:

如果您只需要访问一个进程,您可以使用popen()proc_open() 来执行此操作。

这样的事情可能会奏效:

$handle = popen('ncftp -u username -p password'  , 'w');

foreach ( $files as $file ) {
    fwrite($handle, 'put ' . $file['local_path']. ' '.$file['remote_path'] . "\n");
}

pclose($handle);

【讨论】:

    【解决方案2】:

    这似乎是 PHP 内置的 FTP 功能或 Expect 的工作。

    【讨论】:

    • 我已经使用 PHP 的内置 FTP 构建了一个工作实现,但它比通过 shell 执行运行 NcFtp 慢得多。
    • 出于好奇,哪个零件贵?连接?您需要连接到多个主机吗?传输真的慢吗?
    【解决方案3】:

    我认为你做不到,但你可以做的是将第二次执行包装在一个 shell 脚本中,该脚本将接受多个参数,或者从 STDIN 获取文件名的提要。
    一般来说,这些事情违背了我相信的 php 的心态(这是一个网络请求的生命周期)。
    您还可以使用现有的 php 函数或包装器检查您想要做的部分已经完成。

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多