असिंक्रोनस कार्य कैसे लागू करें
प्रश्न:
भारी व्यवसाय को असिंक्रोनस तरीके से कैसे संसाधित करें, ताकि मुख्य व्यवसाय लंबे समय तक अवरुद्ध न हो। उदाहरण के लिए, मुझे 1000 उपयोगकर्ताओं को ईमेल भेजना है, यह प्रक्रिया बहुत धीमी हो सकती है और कई सेकंडों के लिए अवरुद्ध हो सकती है, इस प्रक्रिया में मुख्य प्रक्रिया अवरुद्ध होने के कारण, यह बाद में आने वाले अनुरोधों को प्रभावित करेगा। इस तरह के भारी कार्य को अन्य प्रक्रियाओं को असिंक्रोनस तरीके से संसाधित करने के लिए कैसे सौंपें।
उत्तर:
आप अपनी मशीन या अन्य सर्वर या यहां तक कि सर्वर क्लस्टर पर पहले से कुछ कार्य प्रक्रियाएँ स्थापित कर सकते हैं, जो भारी व्यवसाय को संसाधित करेंगी। कार्य प्रक्रियाओं की संख्या आवश्यकतानुसार अधिक की जा सकती है, जैसे कि CPU के 10 गुना, और फिर कॉल करने वाला AsyncTcpConnection का उपयोग करके डेटा को इन कार्य प्रक्रियाओं को असिंक्रोनस तरीके से भेजता है, और असिंक्रोनस तरीके से संसाधित परिणाम प्राप्त करता है।
कार्य प्रक्रिया सर्वर
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// कार्य श्रमिक, Text प्रोटोकॉल का उपयोग करते हुए
$task_worker = new Worker('Text://0.0.0.0:12345');
// कार्य प्रक्रियाओं की संख्या आवश्यकतानुसार अधिक की जा सकती है
$task_worker->count = 100;
$task_worker->name = 'TaskWorker';
$task_worker->onMessage = function(TcpConnection $connection, $task_data)
{
// मान लेते हैं कि जो आया है वह json डेटा है
$task_data = json_decode($task_data, true);
// task_data के अनुसार संबंधित कार्य तर्क को संसाधित करें.... परिणाम प्राप्त करें, यहां छोड़ दिया गया....
$task_result = ......
// परिणाम भेजें
$connection->send(json_encode($task_result));
};
Worker::runAll();
Workerman में कॉल करते समय
use Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// वेब सॉकेट सेवा
$worker = new Worker('websocket://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $ws_connection, $message)
{
// दूरस्थ कार्य सेवा से असिंक्रोनस कनेक्शन स्थापित करें, आईपी दूरस्थ कार्य सेवा का आईपी है, अगर यह लोकल मशीन है तो 127.0.0.1 है, अगर यह क्लस्टर है तो LVS का आईपी है
$task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
// कार्य और पैरामीटर डेटा
$task_data = array(
'function' => 'send_mail',
'args' => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'),
);
// डेटा भेजें
$task_connection->send(json_encode($task_data));
// असिंक्रोनस परिणाम प्राप्त करें
$task_connection->onMessage = function(AsyncTcpConnection $task_connection, $task_result)use($ws_connection)
{
// परिणाम
var_dump($task_result);
// परिणाम प्राप्त करने के बाद असिंक्रोनस कनेक्शन बंद करना न भूलें
$task_connection->close();
// संबंधित वेब सॉकेट क्लाइंट को कार्य पूर्ण होने की सूचना दें
$ws_connection->send('task complete');
};
// असिंक्रोनस कनेक्शन का कार्यान्वयन करें
$task_connection->connect();
};
Worker::runAll();
इस प्रकार, भारी कार्य को आपकी मशीन या अन्य सर्वरों की प्रक्रियाओं को करने के लिए सौंपा जाता है, और कार्य पूर्ण होने पर आपको असिंक्रोनस तरीके से परिणाम प्राप्त होता है, जिससे व्यावसायिक प्रक्रिया अवरुद्ध नहीं होती है।