Hem REST hem de SOAP web servislerinin HTTP protokolüne dayanmasıdır.
Bu protokol, metin alışverişi için çok uygundur, ancak veri söz konusu olduğunda, artık eskisi kadar uygun değildir. Çok fazla veri alışverişi ise çok daha az.
Sorun nedir? Verilerin HTTP üzerinden gönderilmesi için öncelikle metne dönüştürülmesi gerekir, bu da işleme ek yükü ekler ve aynı zamanda gönderilecek toplam bilgi miktarını çok daha büyük hale getirir.
Bu neden oluyor?
Binary aktarıma karşı metinsel aktarım
Sorunun kökü, bilgisayardaki verilerin dahili temsilidir.
Çok basit bir örnek: 1234567890 sayısı tamsayı olarak veya 1 2 3 4 5 6 7 8 9 0 karakter dizisi olarak saklanabilir.
İlk durumda, onu depolamak için 31 bite ihtiyacımız olacak (230 = 1073741824 ve 231=2147483648), ikinci durumda ise 80’e ihtiyacımız olacak (her karakter için 8 bit varsayılarak).
Bu, ikili iletimin neden metinsel iletimden daha verimli olduğunu biraz bağlam içine koymak için.
Bu 49 bitlik farkı, gönderilecek büyük bir bilgi kümesiyle çarparsak, çok geçmeden web sunucusunun belirlediği sınıra ulaşırız.
Çözüm ne olabilir?
Web sunucusu ayarlarını değiştir
Bazı senaryolarda, özellikle web sunucusu yapılandırmasını değiştirme yeteneğiniz ve yeteneğiniz varsa, daha ağır HTTP işlemlerine izin vermek için kriterleri biraz gevşetebilirsiniz.
Bu çözüm başlıca iki nedenden dolayı optimal değildir:
- Verimlilik sorununu çözmez
- Yeni sınırları aşacak kadar büyük bir dosya her zaman görünebilecek ve ilk durumuna geri dönecektir.
REST veya SOAP?
REST veya SOAP kullanmanın daha iyi olup olmadığı sorusuna gelince, önemli olmadığını söyleyebilirim.
Sorun, göndermeyi yapmak için HTTP kullanmaktır ve hem REST hem de SOAP buna bağlıdır.
Çözüm, dosyanın gönderilmesini karşı tarafa bildirimden ayırmaktır.
Daha spesifik olarak, sorunu üç bölüme ayırmakla ilgilidir:
- Dosyayı diğer tarafın erişmesi için kullanılabilir hale getirin
- Karşı tarafa, dosyaya erişebilmeleri için bu dosyanın nerede barındırıldığını bildirin.
- Mesajın alıcısından indirme işlemini gerçekleştirin
- Yalnızca 2. adım bir web hizmetine bağlı olmalıdır.
Adım 1 ve 3, çeşitli ikili dosya depolama seçenekleri kullanılarak yapılabilir. Önemli olan, indirme işleminin HTTP kullanmadan yapılabilmesidir.
FTP kullanan bir örnek
Bu bölümde FTP sunucusu kullanan bir çözüm örneğini görebilirsiniz.
client.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php if (!($remoteServer = ftp_connect(getenv('FTP_HOST')))) { die('Not connected :(' . PHP_EOL); } echo 'Connected!' . PHP_EOL; if (!ftp_login($remoteServer, getenv('FTP_USER'), getenv('FTP_PWD'))) { die('Wrong credentials' . PHP_EOL); } echo 'Login succesful!' . PHP_EOL; $remoteFullPath = getenv('REMOTE_BASE_PATH') . '/' . basename($argv[1]); if (!ftp_put($remoteServer, $remoteFullPath, $argv[1], FTP_BINARY)) { die('Upload failed'); } echo 'File ' . $argv[1] . ' uploaded!'.PHP_EOL; ftp_close($remoteServer); $ch = curl_init(getenv('SERVER_URL') . '/upload'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => [ 'path' => $remoteFullPath ], CURLOPT_RETURNTRANSFER => true, ]); $response = curl_exec($ch); if (200 !== curl_getinfo($ch, CURLINFO_RESPONSE_CODE)) { die('Webservice call failed: ' . curl_error($ch)); } curl_close($ch); echo 'Message sent!' . PHP_EOL; |
server.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php error_log('Request received!' . PHP_EOL); if ('post' === strtolower($_SERVER['REQUEST_METHOD'])) { $remotePath = $_POST['path']; error_log('Downloading ' . $remotePath . PHP_EOL); if (!($remoteServer = ftp_connect(getenv('FTP_HOST')))) { http_response_code(500); trigger_error('Not connected :(' . PHP_EOL); die; } trigger_error('Connected!' . PHP_EOL); if (!ftp_login($remoteServer, getenv('FTP_USER'), getenv('FTP_PWD'))) { http_response_code(500); trigger_error('Wrong credentials' . PHP_EOL); die; } trigger_error('Login succesful!' . PHP_EOL); if (!ftp_get($remoteServer, __DIR__ . '/' . basename($remotePath), $remotePath)) { trigger_error('Download of file '.$remotePath.' failed' . PHP_EOL); http_response_code(500); die; } trigger_error('Sucessuflly downloaded '.$remotePath.PHP_EOL); |
Notlar:
- Çözümü daha genel hale getirmek için tüm belirli veriler ortam değişkenlerinde depolanır.
- Bu durumda istemci, sunucu indirme işlemini gerçekleştirene kadar engellenir. Daha gerçekçi bir durumda, durum böyle olmamalıdır. Sunucu, indirme verilerini kaydetmeli ve istemcinin devam edebilmesi ve sonunda indirebilmesi için bir onay vermelidir.











Yorum Yap