Açıklama
Workerman, 4.x sürümünden itibaren HTTP hizmetlerini güçlendirmiştir. Bir istek sınıfı, yanıt sınıfı, oturum sınıfı ve SSE gibi özellikler eklenmiştir. Eğer Workerman'in HTTP hizmetlerini kullanmak istiyorsanız, Workerman 4.x veya daha yeni bir sürümünü kullanmanızı şiddetle öneririz.
Aşağıdaki tüm kullanımlar Workerman 4.x sürümüyle uyumludur ve Workerman 3.x sürümüyle uyumlu değildir.
Önemli
- Chunk veya SSE yanıtı gönderilmediği sürece, bir istekte birden fazla yanıt gönderilmesine izin verilmez, yani bir istekte
$connection->send()
yöntemi birden fazla kez çağrılamaz. - Her istekte sonunda
$connection->send()
yöntemi mutlaka çağrılmalıdır, aksi takdirde istemci sürekli bekleyecektir.
Hızlı Yanıt
HTTP durum kodunu (varsayılan olarak 200), başlık veya çerez özelleştirmeniz gerekmediğinde, doğrudan bir dize göndererek yanıtı tamamlayabilirsiniz.
Örnek
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
// Doğrudan "Bu bir içerik" dizesini istemciye gönder
$connection->send("Bu bir içerik");
};
// İşçiyi çalıştır
Worker::runAll();
Durum Kodunu Değiştirme
Özel durum kodları, başlık veya çerez gerektiğinde, Workerman\Protocols\Http\Response
yanıt sınıfını kullanmanız gerekir. Örneğin, aşağıdaki örnekte, /404
yolu ziyaret edildiğinde 404 durum kodu ve içerik olarak <h1>Özür dileriz, dosya bulunamadı</h1>
döndürülüyor.
Örnek
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
if ($request->path() === '/404') {
$connection->send(new Response(404, [], '<h1>Özür dileriz, dosya bulunamadı</h1>'));
} else {
$connection->send('Bu bir içerik');
}
};
// İşçiyi çalıştır
Worker::runAll();
Response
sınıfı bir kez başlatıldıktan sonra, durum kodunu aşağıdaki şekilde değiştirmek mümkündür.
$response = new Response(200);
$response->withStatus(404);
$connection->send($response);
Başlık Gönderme
Benzer şekilde, başlık göndermek için Workerman\Protocols\Http\Response
yanıt sınıfını kullanmanız gerekir.
Örnek
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$response = new Response(200, [
'Content-Type' => 'text/html',
'X-Header-One' => 'Başlık Değeri'
], 'Bu bir içerik');
$connection->send($response);
};
// İşçiyi çalıştır
Worker::runAll();
Response
sınıfı bir kez başlatıldıktan sonra, başlık eklemek veya değiştirmek için aşağıdaki yöntemleri kullanabilirsiniz.
$response = new Response(200);
// Bir başlık eklemek veya değiştirmek
$response->header('Content-Type', 'text/html');
// Birden fazla başlık eklemek veya değiştirmek
$response->withHeaders([
'Content-Type' => 'application/ json',
'X-Header-One' => 'Başlık Değeri'
]);
$connection->send($response);
Yönlendirme
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function($connection, $request)
{
$location = '/test_location';
$response = new Response(302, ['Location' => $location]);
$connection->send($response);
};
Worker::runAll();
Çerez Gönderme
Benzer şekilde, çerez göndermek için Workerman\Protocols\Http\Response
yanıt sınıfını kullanmanız gerekir.
Örnek
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$response = new Response(200, [], 'Bu bir içerik');
$response->cookie('name', 'tom');
$connection->send($response);
};
// İşçiyi çalıştır
Worker::runAll();
Dosya Gönderme
Benzer şekilde, dosya göndermek için Workerman\Protocols\Http\Response
yanıt sınıfını kullanmanız gerekir.
Dosya gönderirken aşağıdaki yöntemi kullanabilirsiniz
$response = (new Response())->withFile($file);
$connection->send($response);
- Workerman büyük dosyaları göndermeyi destekler
- Büyük dosyalar (2MB'den fazla) için, Workerman tüm dosyayı belleğe birden fazla kez yüklemeyecek, uygun zamanlarda dosyayı parçalayacak ve gönderecektir
- Workerman, istemci tarafından alınan hızı dikkate alarak dosya okuma ve gönderme hızını optimize eder, en hızlı dosya gönderimini sağlarken bellek kullanımını en düşük seviyede tutar
- Veri gönderimi engellenmez, diğer istekleri etkimez
- Dosya gönderilirken, gelecekteki isteklerde sunucunun, dosyanın değiştirilip değiştirilmediğini anlaması ve dosya transferini optimize etmek için 304 yanıtını göndermesi için otomatik olarak
Last-Modified
başlığını ekler - Gönderilen dosya, uygun
Content-Type
başlığını kullanarak tarayıcıya otomatik olarak gönderilir - Eğer dosya mevcut değilse, otomatik olarak 404 yanıtına dönüşür
Örnek
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$file = '/dosya/yolunuz';
// Dosyanın değiştirilip değiştirilmediğini değerlendirmek için if-modified-since başlığını kontrol et
if (!empty($if_modified_since = $request->header('if-modified-since'))) {
$modified_time = date('D, d M Y H:i:s', filemtime($file)) . ' ' . \date_default_timezone_get();
// Dosya değiştirilmediyse 304 yanıtı gönder
if ($modified_time === $if_modified_since) {
$connection->send(new Response(304));
return;
}
}
// Dosya değiştirildiyse veya if-modified-since başlığı yoksa dosyayı gönder
$response = (new Response())->withFile($file);
$connection->send($response);
};
// İşçiyi çalıştır
Worker::runAll();
HTTP Chunk Verisi Gönderme
- Müşteriye önce
Transfer-Encoding: chunked
başlıklı bir Yanıt yanıtı göndermek zorunludur - Sonraki chunk verileri için
Workerman\Protocols\Http\Chunk
sınıfı kullanılır - Sonunda, yanıtı bitirmek için boş bir chunk verilmesi gerekir
Örnek
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Protocols\Http\Chunk;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
// İlk olarak, `Transfer-Encoding: chunked` başlıklı bir Yanıt yanıtı gönder
$connection->send(new Response(200, array('Transfer-Encoding' => 'chunked'), 'hello'));
// Sonraki Chunk verileri için Workerman\Protocols\Http\Chunk sınıfı kullanılır
$connection->send(new Chunk('İlk veri parçası'));
$connection->send(new Chunk('İkinci veri parçası'));
$connection->send(new Chunk('Üçüncü veri parçası'));
// Sonunda, yanıtı bitirmek için boş bir chunk verilir
$connection->send(new Chunk(''));
};
// İşçiyi çalıştır
Worker::runAll();