我使用下面的脚本(结合cron作业)将一个公共网站上生成的XML文件SFTP到FTP服务器,在PHP 7.4中可以正常工作,但是当我尝试在PHP 8.1.16中运行它时,它似乎一直处于加载/运行状态,并且永远不会完成或返回错误。
**更新:**我已经根据评论中的建议做了一些修改,似乎已经缩小到fopen的问题。
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
$file = "MYTempFiles/myXML.xml";
$returnFile = file_put_contents($file, file_get_contents('https://www.example.com/myXML'), LOCK_EX);
$sftpFile = "/username/myXML.xml";
if($returnFile === false) {
die('<p class="center">There was an error processing the XML file.</p>');
}
else {
echo "<p>$returnFile bytes written to file.</p>";
echo "\r\n<p>request-" . time()."</p>";
}
$sftp_server = "sftp.example.com";
$sftp_userpass = "example_pwd";
$sftp_username = "example_username";
$sftp_port ="2245";
class SFTPConnection
{
private $connection;
private $sftp;
public function __construct($host, $port)
{
$this->connection = ssh2_connect($host, $port);
if (! $this->connection)
throw new Exception("Could not connect to $host on port $port.");
}
public function login($username, $password)
{
if (! ssh2_auth_password($this->connection, $username, $password))
throw new Exception("Could not authenticate with username $username " .
"and password $password.");
$this->sftp = ssh2_sftp($this->connection);
if (! $this->sftp)
throw new Exception("Could not initialize SFTP subsystem.");
}
public function uploadFile($local_file, $remote_file)
{
$sftp = $this->sftp;
$sftp = (int)$sftp;
$stream = fopen("ssh2.sftp://$sftp$remote_file", 'w');
if (! $stream)
throw new Exception("Could not open file: $remote_file");
$data_to_send = file_get_contents($local_file);
if ($data_to_send === false)
throw new Exception("Could not open local file: $local_file.");
if (fwrite($stream, $data_to_send) === false)
throw new Exception("Could not send data from file: $local_file.");
fclose($stream);
}
}
try
{
$mySftp = new SFTPConnection($sftp_server, $sftp_port);
$mySftp->login($sftp_username, $sftp_userpass);
$mySftp->uploadFile($file, $sftpFile);
}
catch (Exception $e)
{
echo $e->getMessage() . "\n";
}
我已经比较了两个PHP示例的phpinfo,寻找可能导致脚本无法按预期工作的差异,但我没有看到任何明显的差异。没有得到任何类型的错误,我真的不知道还可以尝试在哪里进行故障排除。
我已经检查过了,确保连接良好,没有任何问题。
在按照建议添加消息调试并删除了我最初拥有的所有@ suppressor之后,我现在收到了以下警告。
Warning: fopen(): Unable to open ssh2.sftp://6/username/myXML.xml on remote host in /filepath_goes_here/sftp-xml-file.php on line 51
Warning: fopen(ssh2.sftp://6/username/myXML.xml): Failed to open stream: operation failed in /filepath_goes_here/sftp-xml-file.php on line 51
Could not open file: /username/myXML.xml
我最初在PHP 7.4上运行SSH 2 v1.2,而8.1示例上运行的是SSH 2 v1.3.1。我后来在PHP 7.4示例上更新到了SSH 2 v1.3.1,它在7.4上仍然可以正常工作,没有任何问题,但在8.1上返回fopen错误。
我已经确认对于8.1示例,allow_url_fopen设置为“on”。
1条答案
按热度按时间zfciruhq1#
我刚从运行PHP 7.0.33的服务器移动到运行8.1.16的服务器时遇到了类似的问题在我的情况下,我得到了一个权限被拒绝的错误:
在两台服务器上,脚本都是由相同的帐户和相同的属性运行的。我检查了fopen状态等在两台服务器上是相同的,并且整个目录树的权限在两台服务器上是相同的。
最后我发现我需要对php路径中的每一个目录都有world execute权限才能读取txt文件,在php7服务器上我对dataroot和data目录有world read权限,对today目录有执行权限。
我不是linux或php的Maven,所以可能错过了一些东西,但是我到处寻找可能的答案,没有找到。