PHP是一種典型的腳本語言,但是在某些情況下,我們需要一些異步執行的操作。在這種情況下,PHP的event擴展成為了我們的救星。
event擴展可以讓我們使用PHP實現異步處理來提高程序的性能,減小耗費時間長的操作對系統性能的影響。
$base = new EventBase(); $event = new Event($base, $fd, Event::READ | Event::PERSIST, function($fd){ // ... 處理事件 }); $event->add(); $base->loop();
上述代碼表示了如何使用event擴展監聽一個文件描述符上的讀事件并進行處理。
如果要監聽多個文件描述符上的事件,我們只需要使用event_base_new函數創建一個Event Base,然后創建多個Event對象并添加到Event Base中,最后通過調用event_base_loop()函數來啟動事件循環即可:
$base = event_base_new(); $event1 = event_new(); // ... 配置并添加 $event1 ... $event2 = event_new(); // ... 配置并添加 $event2 ... event_base_loop($base);
有時候,我們需要對事件進行優先級排序,event擴展也提供了相關方法。
$events = array( [ $event1, Event::READ | Event::PERSIST, 'function1' ], [ $event2, Event::WRITE, 'function2' ], // ... ); $base = new EventBase(); foreach ($events as $e) { $event = new Event($base, $e[0], $e[1], $e[2]); $event->setPriority(10); // 設置優先級 $event->add(); } $base->loop();
上述代碼中,我們可以指定每個Event對象的優先級,事件優先級的范圍為-2到2,數值越大,優先級越高。
event擴展還提供了EventBufferEvent類用于簡化網絡編程中的數據收發,利用EventBufferEvent,我們可以方便地進行非阻塞模式下的TCP/IP通信。
$bev = new EventBufferEvent($base, $socket, EventBufferEvent::OPT_CLOSE_ON_FREE); $bev->setCallbacks(function($buf){ // 數據收到了 }, NULL, function($buf){ // 發生錯誤 }, $arg); $bev->enable(Event::READ | Event::WRITE); // 開始工作 Event::timer($base, function() use ($bev) { $bev->write("hello world!\n"); }, 2000); $base->loop();
上述代碼中利用EventBufferEvent類中的setCallbacks方法設置數據收發的回調函數,同時使用enable方法啟動EventBufferEvent工作。
總之,event擴展提供了非常方便高效的事件處理方法和數據收發模塊,能夠大幅提高程序的性能。