سؤال

أنا في عملية بناء تطبيق ويب سوف، إلى جانب أشياء أخرى، تحتاج إلى الاتصال بخادم FTP لتنزيل أو تحميل الملفات. يتم كتابة التطبيق في PHP ويتم استضافته على خادم Linux.

ما كنت أتساءل هو ما إذا كان من الممكن أيضا تقديم الدعم أيضا إلى خوادم SFTP، ولكن بعد بعض عمليات البحث السريعة على Google، يبدو أن هذا ليس كل هذا بهذه البساطة.

لذلك، السؤال هو: ما هي أفضل طريقة لاستخدام SFTP من داخل PHP؟ هل هناك فئة يمكن أن توفر أيضا الدعم لبروتوكول نقل الملفات وكذلك SFTP بحيث يمكن استخدام نفس الوظائف لكليهما؟

هل كانت مفيدة؟

المحلول

نعم، يمكنك أن تفعل ذلك مع لفة. وبعد للتبديل من FTP إلى SFTP كل ما عليك فعله هو تغيير نموذج خيار البروتوكول CURLPROTO_FTP ل CURLPROTO_SFTP.

يدعم Curl البروتوكولات التالية: HTTP، HTTPS، FTP، FTPS، SCP، SFTP، Telnet، LDAP، LDAP، DICT، ملف، TFTP.

بالمناسبة. SFTP لا يجب الخلط بينها مع FTPS. SFTP هو بروتوكول نقل الملفات SSH، في حين أن FTPS هو FTP عبر SSL.

نصائح أخرى

إذا لم يكن لديك حليقة مثبتة (مضيفي لا)، فيمكنك استخدام phpseclib:

http:/0/ppseclib.sourceforge.net/documentation/net.html#net_sftp.

في حالة انضمام شخص ما في هذه الصفحة.

قد تستخدم أيضا برمجة PHP ل LIBSSH2 مع php. يجب تثبيته بشكل مناسب على النظام.

في أوبونتو 10.04 ويبينان ليني، بالطبع مع جميع الاعتماد

apt-get install libssh2-php

المشكلة مع توصية IGOR هي أنه، من بين أمور أخرى، يجعل الكود الأقل محمولة (LIBSSH2 لم يتم تثبيته على العديد من المضيفين للغاية)، ولديه مصادقة API ومقرها RSA المستندة إلى OOP أكثر بكثير من المنطقي بالفعل (LIBSSH2 يتطلب يمكنك تخزين المفتاح العمومي والمفتاح الخاص بشكل منفصل في نظام الملفات؛ حقيقة أنه يجب توفيره بشكل منفصل هو سخيف لأن معظم صيغ أساسية خاصة تتضمن المفتاح العمومي داخلهم).

phpseclib أسرع أيضا:

http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/#comment_3759.

$dataFile      = 'PASTE_FILE_NAME_HERE';
$sftpServer    = 'PASTE_SFTP_SERVER_NAME_HERE';
$sftpUsername  = 'PASTE_USERNAME_HERE';
$sftpPassword  = 'PASTE_PASSWORD_HERE';
$sftpPort      = 'PASTE_PORT_HERE';
$sftpRemoteDir = '/';

$ch = curl_init('sftp://' . $sftpServer . ':' . $sftpPort . $sftpRemoteDir . '/' . basename($dataFile));

$fh = fopen($dataFile, 'r');

if ($fh) {
    curl_setopt($ch, CURLOPT_USERPWD, $sftpUsername . ':' . $sftpPassword);
    curl_setopt($ch, CURLOPT_UPLOAD, true);
    curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
    curl_setopt($ch, CURLOPT_INFILE, $fh);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($dataFile));
    curl_setopt($ch, CURLOPT_VERBOSE, true);

    $verbose = fopen('php://temp', 'w+');
    curl_setopt($ch, CURLOPT_STDERR, $verbose);

    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);

    if ($response) {
        echo "Success";
    } else {
        echo "Failure";
        rewind($verbose);
        $verboseLog = stream_get_contents($verbose);
        echo "Verbose information:\n" . $verboseLog . "\n";
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top