Özelleştirilmiş İşlem

Webman'da workerman gibi dinleyici veya işlem özelleştirebilirsiniz.

Dikkat
Windows kullanıcılarının özelleştirilmiş işlemleri başlatmak için php windows.php komutunu kullanarak webman'ı başlatmaları gerekmektedir.

Özelleştirilmiş HTTP Servisi

Bazen webman HTTP servisinin çekirdek kodunu değiştirmeniz gerekebilir. Bu durumda özelleştirilmiş işlemler kullanabilirsiniz.

Örneğin, app\Server.php dosyasını oluşturun.

<?php

namespace app;

use Webman\App;

class Server extends App
{
    // Burada Webman\App üzerindeki metodları yeniden yazabilirsiniz.
}

config/process.php dosyasına aşağıdaki yapılandırmayı ekleyin.

use Workerman\Worker;

return [
    // ... Diğer yapılandırmalar burada atlandı...

    'my-http' => [
        'handler' => app\Server::class,
        'listen' => 'http://0.0.0.0:8686',
        'count' => 8, // İşlem sayısı
        'user' => '',
        'group' => '',
        'reusePort' => true,
        'constructor' => [
            'requestClass' => \support\Request::class, // request sınıfı ayarı
            'logger' => \support\Log::channel('default'), // günlük örneği
            'appPath' => app_path(), // app dizini konumu
            'publicPath' => public_path() // public dizini konumu
        ]
    ]
];

İpucu
Eğer webman'ın kendi HTTP işlemini kapatmak istiyorsanız, config/server.php dosyasında listen=>'' ayarını yapmanız yeterlidir.

Özelleştirilmiş WebSocket Dinleyici Örneği

app/Pusher.php dosyasını oluşturun.

<?php
namespace app;

use Workerman\Connection\TcpConnection;

class Pusher
{
    public function onConnect(TcpConnection $connection)
    {
        echo "onConnect\n";
    }

    public function onWebSocketConnect(TcpConnection $connection, $http_buffer)
    {
        echo "onWebSocketConnect\n";
    }

    public function onMessage(TcpConnection $connection, $data)
    {
        $connection->send($data);
    }

    public function onClose(TcpConnection $connection)
    {
        echo "onClose\n";
    }
}

Dikkat: Tüm onXXX özellikleri public olarak tanımlanmalıdır.

config/process.php dosyasına aşağıdaki yapılandırmayı ekleyin.

return [
    // ... Diğer işlem yapılandırmaları atlandı ...

    // websocket_test işlem adı olarak belirlendi
    'websocket_test' => [
        // Burada işlem sınıfı belirtiliyor, yukarıda tanımlı olan Pusher sınıfı
        'handler' => app\Pusher::class,
        'listen'  => 'websocket://0.0.0.0:8888',
        'count'   => 1,
    ],
];

Özelleştirilmiş Dinleyici Olmayan İşlem Örneği

app/TaskTest.php dosyasını oluşturun.

<?php
namespace app;

use Workerman\Timer;
use support\Db;

class TaskTest
{

    public function onWorkerStart()
    {
        // Her 10 saniyede bir veritabanında yeni kullanıcı kaydı olup olmadığını kontrol et
        Timer::add(10, function(){
            Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
        });
    }

}

config/process.php dosyasına aşağıdaki yapılandırmayı ekleyin.

return [
    // ... Diğer işlem yapılandırmaları atlandı ...

    'task' => [
        'handler'  => app\TaskTest::class
    ],
];

Dikkat: listen atlanırsa hiçbir port dinlenmez, count atlanırsa işlem sayısı varsayılan olarak 1'dir.

Yapılandırma Dosyası Açıklaması

Bir işlemin tam yapılandırma tanımı aşağıdaki gibidir:

return [
    // ... 

    // websocket_test işlem adı olarak belirlenmiştir.
    'websocket_test' => [
        // Burada işlem sınıfı belirtiliyor
        'handler' => app\Pusher::class,
        // Dinlenilen protokol ip ve port (isteğe bağlı)
        'listen'  => 'websocket://0.0.0.0:8888',
        // İşlem sayısı (isteğe bağlı, varsayılan 1)
        'count'   => 2,
        // İşlemin çalışma kullanıcı adı (isteğe bağlı, varsayılan olarak mevcut kullanıcı)
        'user'    => '',
        // İşlemin çalışma kullanıcı grubu (isteğe bağlı, varsayılan olarak mevcut grup)
        'group'   => '',
        // Geçerli işlemin yeniden yüklenebilir olup olmadığı (isteğe bağlı, varsayılan true)
        'reloadable' => true,
        // reusePort açılıp açılmayacağı
        'reusePort'  => true,
        // taşıma (isteğe bağlı, ssl açıldığında ssl olarak ayarlanmalı, varsayılan tcp)
        'transport'  => 'tcp',
        // bağlam (isteğe bağlı, transport ssl ise sertifika yolu belirtilmelidir)
        'context'    => [], 
        // İşlem sınıfının konstruktor parametreleri, burada process\Pusher::class sınıfının konstruktor parametreleri (isteğe bağlı)
        'constructor' => [],
        // Geçerli işlemin etkin olup olmadığı
        'enable' => true
    ],
];

Özet

Webman'ın özelleştirilmiş işlemleri aslında workerman'ın basit bir paketlemesidir. Yapılandırmayı ve iş mantığını ayırır ve workerman'ın onXXX geri çağırmalarını sınıf yöntemleri aracılığıyla uygular, diğer kullanımlar workerman ile tamamen aynıdır.