2013-01-25 34 views
2

我正在使用PECL ssh2模块将XML数据输出到sftp服务器。我有两个完全独立的PHP脚本,它们收集不同的数据并将输出发送到stfp服务器上的不同文件。使用相同的ssh2.sftp资源分离PHP进程

客户EXPORT:

$conn = ssh2_connect(SFTP_SERVER, SFTP_PORT); 
ssh2_auth_password($conn, SFTP_USER, SFTP_PWD); 
$sftp = ssh2_sftp($conn); 
$file = 'ssh2.sftp://' . $sftp . CUSTOMER_EXPORT_PATH . CUSTOMER_EXPORT_FILENAME; 
$doc = new DOMDocument('1.0','UTF-8'); 
CustomerExportXML($doc); 
if (file_exists($file)) { 
    unlink($file); 
} 
$bytes_saved = $doc->save($file); 

产品外销:

$conn = ssh2_connect(SFTP_SERVER, SFTP_PORT); 
ssh2_auth_password($conn, SFTP_USER, SFTP_PWD); 
$sftp = ssh2_sftp($conn); 
$file = 'ssh2.sftp://' . $sftp . PRODUCT_EXPORT_PATH . PRODUCT_EXPORT_FILENAME; 
$doc = new DOMDocument('1.0','UTF-8'); 
ProductExportXML($doc); 
if (file_exists($file)) { 
    unlink($file); 
} 
$bytes_saved = $doc->save($file); 

在每种情况下XxxExportXML($doc)功能需要几分钟来收集相关数据和填充它到$文档。

每个脚本按原样工作,并将正确的数据导出到正确的位置。

问题是当它们的执行仅与实际写入到sftp服务器的最后一个执行重叠时。如果我呼应了$文件变量,然后在每种情况下它们都具有相同的资源ID即ssh2.sftp://ResourceID#150/Customer/Customer.xmlssh2.sftp://ResourceID#150/Product/Product.xml

所以我的问题是,为什么是这两个过程相互干扰,以及如何解决呢,这样他们既可以同时运行?

+0

不错的问题,你如何运行命令,手动或通过cron工作? –

回答

0

所以他们是两个不同的脚本?这很奇怪。也许试试phpseclib, a pure PHP SFTP implementation。例如。

<?php 
include('Net/SFTP.php'); 

$sftp = new Net_SFTP('www.domain.tld'); 
if (!$sftp->login('username', 'password')) { 
    exit('Login Failed'); 
} 

// puts a three-byte file named filename.remote on the SFTP server 
$sftp->put('filename.remote', 'xxx'); 
+0

感谢这个建议。我确实看过phpseclib作为替代方案。我决定不去用它,因为它太纯粹了。也就是说,它可以以真正的sftp方式传输文件等,但它不能像在ssh2 mod中那样用作PHP中的文件句柄。这对我来说很重要,因为生成的文件可能很大,并且可以立即请求很多文件,这意味着如果我必须先将它们写在本地,然后传输它们,则会受到磁盘空间和带宽的限制。 – Gordy

+0

我有点怀疑它不能用phpseclib完成。 ''$ doc-> save($ file)''做什么?好像phpseclib可以做的一样。也许你正在写字节到远程文件系统,因为它们可用?如果是这样的话,看起来你可以使用''NET_SFTP_RESUME''作为''sftp-> put()''的第三个参数。这会将数据追加到文件而不是覆盖文件。 – neubert

+0

'$ doc-> save($ file)'是'DOMDocument :: save($ fh)'方法,您可以在[PHP手册]中看到(http://www.php.net/manual/en/ domdocument.save.php)。所以在这种情况下,'$ file'包含一个url文件句柄,然后可以根据需要传递。 phpseclib没有文件句柄样式属性。因此,为了使用它,我必须先将XML字符串写入内存或本地磁盘,然后使用phpseclib将其传输。我没有足够的磁盘空间或内存来执行此操作。由于数据不是字符串格式,而是作为DOMDocument对象捆绑起来,因此我无法实时完成此操作。 – Gordy

相关问题