Swoole ialah rangka kerja pengaturcaraan berorientasikan rangkaian tak segerak berprestasi tinggi berdasarkan PHP Ia boleh merealisasikan IO asynchronous, multi-threading berbilang proses, coroutine dan ciri-ciri lain, dan boleh meningkatkan prestasi PHP dalam pengaturcaraan rangkaian. Dalam banyak senario aplikasi masa nyata dan konkurensi tinggi, Swoole telah menjadi pilihan pertama untuk pembangun. Artikel ini akan memperkenalkan cara menggunakan Swoole untuk melaksanakan muat naik fail besar berkonkurensi tinggi.
1. Masalah dengan penyelesaian tradisional
Dalam penyelesaian muat naik fail tradisional, kaedah permintaan HTTP POST biasanya digunakan, iaitu, data fail diserahkan melalui borang, dan kemudian bahagian belakang menerima permintaan itu. Kemudian muat naik dengan membaca data fail. Kaedah ini mampu apabila memproses fail kecil, tetapi akan terdapat banyak masalah apabila memproses fail besar:
Memuat naik fail Semasa proses, data keseluruhan fail perlu dibaca ke dalam memori sebelum memuat naik. Apabila fail yang dipindahkan agak besar, masa membaca akan menjadi sangat lama, dan PHP adalah satu proses Apabila terdapat sejumlah besar permintaan muat naik fail, proses perkhidmatan akan disekat dan prestasi keseluruhan pelayan akan terjejas. .
Memandangkan keseluruhan data fail perlu dibaca ke dalam memori untuk dimuat naik, ia akan menduduki sejumlah besar memori pelayan, seterusnya menjejaskan prestasi.
Memandangkan keseluruhan data fail perlu dibaca dan dimuat naik sebelum balasan dikembalikan, masa respons akan menjadi sangat lama, mengakibatkan pengguna lemah pengalaman yang baik.
2. Penyelesaian muat naik fail besar berdasarkan Swoole
Swoole boleh mengendalikan permintaan rangkaian dalam dua cara: pelayan HTTP dan pelayan TCP. Yang pertama lebih sesuai untuk aplikasi web, manakala yang kedua digunakan untuk pelbagai aplikasi dan protokol rangkaian tersuai. Dalam artikel ini, kami menggunakan pelayan HTTP untuk melaksanakan senario muat naik fail yang besar. Swoole menyediakan dua objek terbina dalam, swoole_http_request dan swoole_http_response, yang melaluinya maklumat tentang permintaan dan respons HTTP boleh diperolehi.
a. Permintaan pelanggan
Klien memuat naik data fail ke pelayan melalui permintaan POST dan pelayan memperoleh data yang dimuat naik. melalui objek swoole_http_request Data fail.
b. Pemprosesan bahagian pelayan
Untuk setiap permintaan fail di bahagian pelayan, kami boleh mendapatkan maklumat muat naik fail melalui objek swoole_http_request, termasuk nama fail, jenis fail, saiz fail, dsb. . Selepas itu, fail boleh dimuat naik melalui coroutine tak segerak yang disediakan oleh Swoole, dan fail itu boleh dibaca dalam ketulan dan dipindahkan ke pelayan sasaran (seperti Alibaba Cloud Object Storage OSS). Perlu diingatkan apabila memuat naik fail bahawa anda boleh menggunakan kaedah coroutine yang disediakan oleh Swoole untuk penstriman penghantaran data, yang boleh memastikan jejak memori agak kecil.
c. Respons pelayan
Selepas muat naik fail selesai, pelayan perlu memberikan maklumat fail muat naik dan muat naik yang berjaya. Memandangkan Swoole menyediakan objek swoole_http_response untuk bertindak balas secara langsung kepada permintaan http, kami boleh menggunakannya secara langsung untuk bertindak balas kepada pelanggan.
3. Contoh Kod
Berikut ialah contoh kod mudah untuk penyelesaian muat naik fail besar berdasarkan Swoole.
<?php use SwooleHttpRequest; use SwooleHttpResponse; $http = new SwooleHttpServer("127.0.0.1", 9501); $http->on("request", function(Request $request, Response $response) { $filename = $request->files['file']['name']; $filepath = '/path/to/your/file' . $filename; $filesize = $request->header['content-length']; $tempPath = $request->files['file']['tmp_name']; $filetype = $request->files['file']['type']; $response->header("Content-Type", "application/json"); $response->header("Access-Control-Allow-Origin", "*"); $fp = fopen($tempPath, 'r'); $client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP); $client->connect('your-oss-cn-addr', 'your-oss-cn-port'); $client->send("your-key"); $client->send("your-secret"); $client->send($filename); $client->send($filesize); $client->send($filetype); while (!feof($fp)) { $client->send(fread($fp, 8192)); } fclose($fp); $client->close(); $response->end(json_encode([ 'success' => true, 'message' => '文件上传成功' ])); }); $http->start();
4. Nota
Menggunakan Swoole memerlukan memulakan sambungan PHP yang sepadan, yang boleh dipasang melalui arahan berikut:
pecl install swoole
Apabila menggunakan Swoole untuk memuat naik fail, anda perlu mengkonfigurasi parameter berkaitan pelayan Swoole. Sebagai contoh, anda perlu menetapkan bilangan proses pekerja, tahap rakaman maklumat log, nombor port, dsb., yang boleh ditetapkan mengikut keperluan khusus. Dalam contoh kod di atas, kami menggunakan kod berikut untuk konfigurasi:
$http = new SwooleHttpServer("127.0.0.1", 9501);
Apabila memuat naik fail, data yang dimuat naik perlu dicache dan diproses. Oleh itu, sejumlah besar memori boleh digunakan semasa memproses muat naik fail. Untuk mengelakkan masalah limpahan memori, anda boleh mempertimbangkan untuk membaca fail dalam ketulan, menghantar setiap keping data selepas membacanya, dan kemudian membaca sekeping data seterusnya selepas penghantaran selesai.
5. Ringkasan
Artikel ini memperkenalkan cara menggunakan Swoole untuk melaksanakan muat naik fail besar berkonkurensi tinggi. Berbanding dengan kaedah muat naik fail tradisional, menggunakan Swoole boleh meningkatkan kecekapan muat naik fail dan meningkatkan prestasi pelayan. Dalam aplikasi sebenar, skema muat naik yang sesuai dan konfigurasi parameter Swoole boleh dipilih mengikut keperluan khusus.
Atas ialah kandungan terperinci Swoole melaksanakan penyelesaian muat naik fail besar berkonkurensi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!