Rumah >rangka kerja php >Workerman >Pembangunan pekerja: Bagaimana untuk melaksanakan pemindahan fail berdasarkan protokol TCP

Pembangunan pekerja: Bagaimana untuk melaksanakan pemindahan fail berdasarkan protokol TCP

WBOY
WBOYasal
2023-11-07 09:14:021127semak imbas

Pembangunan pekerja: Bagaimana untuk melaksanakan pemindahan fail berdasarkan protokol TCP

Pembangunan Pekerja: Bagaimana untuk melaksanakan pemindahan fail berdasarkan protokol TCP, contoh kod khusus diperlukan

Pengenalan:
Dalam era Internet hari ini, pemindahan fail telah menjadi bahagian yang sangat diperlukan dalam kerja dan kehidupan harian. Penghantaran fail berdasarkan protokol TCP adalah kaedah dengan kecekapan penghantaran yang tinggi dan kebolehpercayaan yang kuat. Dalam artikel ini, kami akan memperkenalkan cara menggunakan rangka kerja Workerman untuk membangunkan perkhidmatan pemindahan fail berdasarkan protokol TCP dan menyediakan contoh kod khusus.

1. Apakah itu Pekerja?
Workerman ialah rangka kerja Soket PHP berprestasi tinggi yang dibangunkan menggunakan PHP tulen, digunakan untuk membina aplikasi berbilang proses/berbilang benang dengan cepat. Ia menyokong protokol TCP/UDP, protokol tersuai dan ciri lain. Pekerja mempunyai banyak kelebihan, seperti keupayaan pemprosesan serentak yang tinggi dan kestabilan yang baik. Oleh itu, adalah wajar untuk memilih Pekerja sebagai rangka kerja untuk perkhidmatan pemindahan fail.

2. Persediaan untuk pemindahan fail berdasarkan protokol TCP
Sebelum memulakan pembangunan, anda perlu memastikan bahawa persekitaran PHP telah dipasang pada sistem dan rangka kerja Workerman telah dipasang. Workerman boleh dipasang melalui arahan berikut:

composer require workerman/workerman

Selepas pemasangan selesai, anda boleh membuat pemindahan fail.php baharu untuk perkhidmatan pemindahan fail, dan memperkenalkan rangka kerja Workerman pada permulaan fail:

require_once __DIR__ . '/vendor/autoload.php';

3. Tulis kod untuk perkhidmatan pemindahan fail

  1. Kod untuk memulakan perkhidmatan pemindahan fail adalah seperti berikut:

    use WorkermanWorker;
    
    // 创建一个Worker监听指定端口
    $worker = new Worker('tcp://0.0.0.0:600');
    
    // 设置运行的进程数,这里设置为1
    $worker->count = 1;
    
    // 定义文件传输相关的处理逻辑
    $worker->onMessage = function($connection, $data) {
     // 处理文件传输逻辑
     // ...
    };
    
    // 启动Worker
    Worker::runAll();

    Kod di atas mencipta contoh Pekerja dengan memanggil pembina kelas Pekerja dan menentukan port pendengaran sebagai 600. Kemudian tetapkan bilangan proses berjalan kepada 1 dan tentukan logik pemprosesan logik pemindahan fail. Akhir sekali, mulakan Worker dengan memanggil kaedah statik runAll() kelas Worker.

  2. Seterusnya, kita perlu menulis logik khusus pemindahan fail. Dalam fungsi panggil balik onMessage, anda boleh menggunakan fungsi pemprosesan fail PHP untuk merealisasikan pemindahan fail.

    use WorkermanConnectionTcpConnection;
    
    // ...
    
    $worker->onMessage = function(TcpConnection $connection, $data) {
     if (strpos($data, 'start:') === 0) {
         // 获取文件名和文件大小
         $fileInfo = explode(':', $data);
         $fileName = $fileInfo[1];
         $fileSize = intval($fileInfo[2]);
    
         // 创建新的文件,并准备接收文件数据
         $file = fopen($fileName, 'w');
         $connection->file = $file;
         $connection->fileSize = $fileSize;
         $connection->currentSize = 0;
    
     } elseif ($connection->file && strlen($data) === 1024) {
         // 写入文件数据
         fwrite($connection->file, $data);
         $connection->currentSize += strlen($data);
    
         // 文件传输完成
         if ($connection->currentSize === $connection->fileSize) {
             fclose($connection->file);
             $connection->file = null;
             // 响应文件传输完成消息
             $connection->send('文件传输完成');
         }
     }
    };

    Dalam kod di atas, atribut instance kelas TcpConnection digunakan untuk menyimpan maklumat berkaitan fail. Apabila menerima mesej permulaan pemindahan fail (mesej bermula dengan "mulakan:"), mula-mula menghuraikan nama fail dan saiz fail daripada mesej, kemudian buat fail baharu melalui fungsi fopen, dan gunakan sifat kelas TcpConnection contoh untuk menyimpan Pemegang fail, saiz fail dan saiz yang diterima sekarang. Apabila data fail diterima, gunakan fungsi fwrite untuk menulis data pada fail dan kemas kini saiz yang diterima sekarang. Apabila saiz yang diterima adalah sama dengan saiz fail, ia menunjukkan bahawa pemindahan fail telah selesai, pemegang fail ditutup dan mesej penyempurnaan pemindahan dihantar kepada klien melalui kaedah hantar contoh TcpConnection.

4 Uji perkhidmatan pemindahan fail
Untuk menguji perkhidmatan pemindahan fail, anda boleh menggunakan telnet atau program pelanggan tersuai untuk menyambung ke pelayan dan menghantar data fail.

use WorkermanConnectionAsyncTcpConnection;

$connection = new AsyncTcpConnection('tcp://127.0.0.1:600');

$connection->onConnect = function() use($connection) {
    // 发送文件传输开始消息
    $connection->send('start:/path/to/file.txt:1024');
    
    // 读取文件数据并发送
    $file = fopen('/path/to/file.txt', 'r');
    while (!feof($file)) {
        $connection->send(fread($file, 1024));
    }

    // 关闭连接
    $connection->close();
};

$connection->connect();

Dalam kod di atas, mula-mula buat contoh AsyncTcpConnection dan nyatakan alamat sambungan dan port. Selepas sambungan diwujudkan, gunakan kaedah hantar untuk menghantar mesej bahawa pemindahan fail telah dimulakan, dan baca data fail dan hantarnya. Selepas menghantar, tutup sambungan melalui kaedah tutup.

5. Ringkasan
Melalui rangka kerja Workerman, kami boleh melaksanakan perkhidmatan pemindahan fail dengan mudah berdasarkan protokol TCP. Artikel ini menyediakan contoh kod perkhidmatan pemindahan fail khusus untuk membantu pembangun menguasai dan menggunakan Workerman dengan lebih cepat untuk pembangunan berkaitan pemindahan fail. Saya harap artikel ini dapat membantu anda, dialu-alukan untuk berkomunikasi dan berbincang.

Atas ialah kandungan terperinci Pembangunan pekerja: Bagaimana untuk melaksanakan pemindahan fail berdasarkan protokol TCP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn