无法从一台服务器上载至PHP中的FTP服务器,但可以从另一台服务器上工作

时间:2018-06-26 17:32:09

标签: php laravel ftp

我的脚本有问题。 我在Infomaniak(共享主机)中创建了一个网站 PHP脚本将文件发送到远程FTP服务器。

然后,我更改为另一台主机(也共享):Swisscenter。 在该服务器上不起作用

这是相同的脚本,具有相同的登录名。 目标服务器上没有IP白名单

我使用PHP 5.6和7.0进行了测试,没有变化

这是错误:https://pastebin.com/ZSyVLtsF

Whoops, looks like something went wrong.
1/1
ErrorException in FTP.php line 47:
ftp_put(): Opening data channel for file transfer.
in FTP.php line 47
at HandleExceptions->handleError('2', 'ftp_put(): Opening data channel for file transfer.', '/website/website.ch/src/app/FTPManager/FTP.php', '47', array('remote_file' => 'src/storage/path/test.TXT', 'file' => 'commande/test.TXT'))
at ftp_put(resource, 'commande/test.TXT', 'src/storage/path/test.TXT', '2') in FTP.php line 47
at FTP->upload('src/storage/path/test.TXT', 'commande/test.TXT') in AdminController.php line 174
at AdminController->sendOrderFtp(object(Order)) in AdminController.php line 124
at AdminController->validateOrderPost(object(Request), 'test')
at call_user_func_array(array(object(AdminController), 'validateOrderPost'), array(object(Request), 'id' => 'test')) in Controller.php line 80
at Controller->callAction('validateOrderPost', array(object(Request), 'id' => 'test')) in ControllerDispatcher.php line 146
at ControllerDispatcher->call(object(AdminController), object(Route), 'validateOrderPost') in ControllerDispatcher.php line 94
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 96
at ControllerDispatcher->callWithinStack(object(AdminController), object(Route), object(Request), 'validateOrderPost') in ControllerDispatcher.php line 54
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\AdminController', 'validateOrderPost') in Route.php line 174
at Route->runController(object(Request)) in Route.php line 140
at Route->run(object(Request)) in Router.php line 724
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AuthenticateWithBasicAuth.php line 38
at AuthenticateWithBasicAuth->handle(object(Request), object(Closure))
at call_user_func_array(array(object(AuthenticateWithBasicAuth), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 726
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 699
at Router->dispatchToRoute(object(Request)) in Router.php line 675
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ViewFiller.php line 37
at ViewFiller->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ViewFiller), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Language.php line 36
at Language->handle(object(Request), object(Closure))
at call_user_func_array(array(object(Language), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53

我不明白为什么它可以在第一台主机上运行,​​而不是第二台主机上运行 任何想法 ? 谢谢

更新

这是FTP的PHP类:

namespace App\FTPManager;


class FTP
{
    protected $host;
    protected $port;
    protected $timeout;
    protected $connection;
    protected $mode = FTP_BINARY;// FTP_ASCII;

    public function __construct($host, $port = 21, $timeout = 90)
    {
        $this->host = $host;
        $this->port = $port;
        $this->timeout = $timeout;
    }


    /**
     * @return mixed
     */
    public function getConnection()
    {
        if (!$this->connection) {
            $this->connection = ftp_connect($this->host, $this->port, $this->timeout);
        }
        return $this->connection;
    }


    public function login($username, $password)
    {
        return ftp_login($this->getConnection(), $username, $password);
    }

    public function upload($remote_file, $file)
    {
        return ftp_put($this->getConnection(), $file, $remote_file, $this->mode);
    }

    public function download($file, $remote_file)
    {
        return ftp_get($this->getConnection(), $remote_file, $file, $this->mode);
    }

    public function close()
    {
        ftp_close($this->connection);
        $this->connection = null;
    }
}

1 个答案:

答案 0 :(得分:1)

使用ftp_pasv();只需检查此链接https://www.w3schools.com/php/func_ftp_pasv.asp