使用PHP 7.4的脚本在PHP 8.1中使用SSH2返回fopen错误

wpx232ag  于 2023-03-16  发布在  PHP
关注(0)|答案(1)|浏览(175)

我使用下面的脚本(结合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”。

zfciruhq

zfciruhq1#

我刚从运行PHP 7.0.33的服务器移动到运行8.1.16的服务器时遇到了类似的问题在我的情况下,我得到了一个权限被拒绝的错误:

fopen(../../dataroot/data/today/relations.txt): Failed to open stream:

在两台服务器上,脚本都是由相同的帐户和相同的属性运行的。我检查了fopen状态等在两台服务器上是相同的,并且整个目录树的权限在两台服务器上是相同的。
最后我发现我需要对php路径中的每一个目录都有world execute权限才能读取txt文件,在php7服务器上我对dataroot和data目录有world read权限,对today目录有执行权限。
我不是linux或php的Maven,所以可能错过了一些东西,但是我到处寻找可能的答案,没有找到。

相关问题