PHP को तेजी से (ReactPHP के साथ)

इस पोस्ट में, मैं PHP दुनिया के लिए एक असामान्य तरीका साझा करना चाहूंगा, एक आवेदन बनाने का तरीका, अगर आपको पसंद है - वास्तुकला। यह दृष्टिकोण PHP टूल्स को कई बार संसाधित अनुरोधों की संख्या बढ़ाने की अनुमति देता है। मैं इस दिशा में अपने सर्वोत्तम अभ्यासों को भी साझा करूंगा। बेशक, यह दृष्टिकोण कोड आवश्यकताओं के संदर्भ में स्वतंत्र नहीं है, लेकिन इसे क्रम में करते हैं।




हां, अंत में हमें नियमित PHP की तुलना में 30 गुना और PHP + OPcache की तुलना में 6 गुना प्रदर्शन वृद्धि मिलेगी। लेकिन शुरुआत से, मैं PHP अनुप्रयोगों के प्रदर्शन को बेहतर बनाने के लिए मौजूदा, लोकप्रिय समाधानों के बारे में बात करना चाहूंगा।

OPcache

अधिकांश आधुनिक इंस्टॉलेशन APC / OPcache का उपयोग करते हैं और इसे PHP के लिए मानक और अधिकतम माना जाता है। इस दृष्टिकोण में कम से कम नुकसान हैं, जैसे यह एक मूल (देशी) समाधान है जो PHP टीम द्वारा हमें दिया जाता है। सब कुछ ठीक होगा, लेकिन पर्याप्त गति नहीं।

HHVM

एचएचवीएम वास्तव में अच्छा है, लोकप्रिय लिनक्स डिस्ट्रोस के लिए पहले से ही रिपॉजिटरी हैं और जो कुछ भी बाकी है वह स्थापित और कॉन्फ़िगर करना है, जो आमतौर पर एक मुश्किल चीज नहीं है। लेकिन यह फेसबुक टीम से एक विकास है और फिलहाल, एचएचवीएम एक्सटेंशन की पसंद को सीमित करता है, और अगर आपके पास अचानक पीएचपी एक्सटेंशन के लिए अपना पैच है, तो यह पीएचएच से एचएचवीएम के दर्द रहित संक्रमण का अंत करता है। आप PHP 5.5 के बारे में भी भूल सकते हैं। यह मुख्य टूल और फ्रेमवर्क के साथ एचएचवीएम की अनुकूलता बढ़ाने के लिए फेसबुक टीम के उत्कृष्ट कार्य को ध्यान देने योग्य है, लेकिन यह आंकड़ा अभी भी लगभग 97% है।

मेरे दिमाग में आने वाले विकल्पों में से अभी भी कच्चे हिप्पीवीएम और फाल्कोनकॉपी फ्रेमवर्क हैं। फाल्कन के बारे में बहुत सारी समीक्षाएं लिखी गई हैं और मुझे लगता है कि यह उन्हें दोहराने के लिए कोई मतलब नहीं है। HippyVM विकास के तहत है, वैसे यह facebook टीम से HHVM का एक विकल्प है, जो अजगर में लिखा गया है, जो मेरी राय में इस परियोजना को और भी धूमिल बनाता है।

टिप्पणियों में अन्य विकल्प सुझाएं।

क्लासिक PHP इंस्टॉलेशन में Nginx, Apache या Lighttpd वेब सर्वरों में से एक को स्थापित करना शामिल है, जो आने वाले HTTP अनुरोधों को प्रोसेस करता है और गतिशील लोगों को PHP में रीडायरेक्ट करता है। PHP को वेब सर्वर से जोड़ने के लिए कई विकल्प हैं:

सभी PHP त्वरण समाधान आम तौर पर वेब सर्वर से स्क्रिप्ट को अनुरोध को पुनर्निर्देशित करने के क्षण में धीमी PHP दुभाषिया को तेज करने के उद्देश्य से होते हैं, जो कि प्रदर्शन परीक्षणों से देखा जाता है, इसका परिणाम देता है। लेकिन इस समाधान में एक कमी है, वैसे भी, लेकिन हर PHP अनुरोध के लिए आवेदन को कक्षाएं घोषित करना होगा, उदाहरणों को बनाना होगा, डेटाबेस से कनेक्ट करना होगा, कैश पढ़ना होगा - अपने पर्यावरण को इनिशियलाइज़ करना होगा। और कोई फर्क नहीं पड़ता कि हम PHP दुभाषिया को कैसे तेज करते हैं, बहुत सारे संसाधन पूरे आरंभीकरण पर खर्च किए जाते हैं, और यह दृष्टिकोण स्पष्ट रूप से वांछनीय से बहुत दूर है, खासकर अत्यधिक लोड किए गए समाधानों के लिए। ऐसा क्यों हो रहा है? PHP मूल रूप से एक टेम्पलेट भाषा और टूलकिट के रूप में डिज़ाइन किया गया था, और एक स्टैंडअलोन वेब सर्वर के रूप में कल्पना नहीं की गई थी। इसके अलावा, PHP में नोड.जेएस की तरह कोई समानांतर निष्पादन या यहां तक ​​कि अतुल्यकालिक नहीं है, और सभी लिखित एक्सटेंशन अवरुद्ध हैं।

लेकिन PHP अभी भी खड़ा नहीं है। हमारे पास हजारों उपकरणों के साथ अपना स्वयं का पारिस्थितिकी तंत्र है जो आसानी से संगीतकार के लिए धन्यवाद स्थापित किया जा सकता है। PHP ने जावा, जेएस और अन्य जैसी भाषाओं से कई पैटर्न उधार लिए हैं, सिम्फनी टीम के लिए नमस्ते। ऐसे उपकरण हैं जो PHP को अतुल्यकालिक रूप से काम करने की अनुमति देते हैं। इस विषय पर पहले से ही हैबे पर एक लेख है , मैं इस दृष्टिकोण के विवरण में इसे नहीं दोहराऊंगा। मैं केवल यह कह सकता हूं कि अतुल्यकालिक दृष्टिकोण हमें न केवल वेबसैट पर एक चैट बनाने की अनुमति देता है, बल्कि एक पूर्ण HTTP सर्वर भी लॉन्च करने की अनुमति देता है, जिसका अर्थ है कि हमें प्रत्येक अनुरोध के लिए PHP को प्रारंभ करने की आवश्यकता नहीं है। इस प्रकार, यह अनुमान लगाना मुश्किल नहीं है, यह दृष्टिकोण विभिन्न रूपरेखाओं को शुरू करने में लगने वाले समय को समाप्त कर देगा और अंततः प्रतिक्रिया समय में सुधार करेगा।

शीर्षक समाधान का अर्थ है कि यह समाधान, ReactPHP पर बनाया गया है। प्रतिक्रिया स्वयं एक टर्नकी समाधान की तुलना में अधिक निर्माण उपकरण है। यद्यपि इसके पास पहले से ही आने वाले Http कनेक्शन को संसाधित करने के लिए उपकरण हैं, इसके पास विभिन्न उपकरण भी हैं, उदाहरण के लिए, वेबस्कैट या एसिंक्स रेडिस के साथ काम करने के लिए, लेकिन इसमें आधुनिक एमवीसी रूपरेखाओं से परिचित पितर, राउटिंग आदि नहीं हैं। इन उद्देश्यों के लिए, हम ReactPHP को एक मौजूदा Symfony2 एप्लिकेशन से जोड़ेंगे।

ReactPHP ईवेंटलूप पर आधारित है और इस आर्किटेक्चर को लागू करने के लिए एक्स-लिबवेंट, एक्स-लिबेव, एक्स-इवेंट में से एक को स्थापित करने का विकल्प प्रदान करता है। विफलता की स्थिति में, React स्ट्रीम_सेलेक्ट के माध्यम से काम करता है और अतुल्यकालिक क्षमताओं को कम से कम किया जाता है, क्योंकि वास्तव में, सब कुछ प्रक्रिया को बाधित करने की संभावना के बिना बदले में निष्पादित किया जाएगा। बेशक, आप इसे छोड़ सकते हैं, क्योंकि अनिवार्य रूप से अतुल्यकालिक, यह एक ही प्रक्रिया के भीतर कार्यों की एक श्रृंखला है। लेकिन यदि फ़ंक्शन नॉन-ब्लॉकिंग कॉल का उपयोग करता है, उदाहरण के लिए async-redis, तो stream_select पर आधारित एक ईवेंटलूप इस फ़ंक्शन को निष्पादित करने के लिए प्रतीक्षा करने के लिए मजबूर किया जाएगा, क्योंकि गैर-अवरोधक कॉल की अवधि के लिए php फ़ंक्शन को बाधित करने का कोई तरीका नहीं है। बेशक, यह कार्यात्मक को तोड़कर किया जा सकता है, लेकिन मुझे आशा है कि समस्या का सार स्पष्ट है।

मैं मूल समाधानों का प्रस्तावक हूं, और pecl एक्सटेंशन स्थापित करना बहुत अधिक शामिल नहीं है। इसके अलावा, पूरे सर्वर बेड़े में pecl की स्थापना की आवश्यकता होगी और होस्टिंग पर समस्याएं होंगी। लेकिन PHP में PHP 5.5 का उपयोग करके coroutine को लागू करने की क्षमता है। निकिक ( हब पर अनुवाद ) से एक अद्भुत लेख के लिए धन्यवाद, मैंने वर्णित निकिक कार्य अनुसूचक के आधार पर अपने ईवेंटलूप कार्यान्वयन का निर्माण करने का निर्णय लिया। हां, यह आसान नहीं लगता है, और आदत से यह वास्तव में PHP में निर्माण अनुप्रयोगों की प्रस्तुति में पूरी तरह से बदलाव की आवश्यकता है। लेकिन मेरी राय में इस तरह के निर्णय PHP का भविष्य हैं।

वैसे, सिम्फनी को संयोग से नहीं चुना गया था। सिम्फनी इनकमिंग रिक्वेस्ट प्रोसेसिंग स्टैक के कार्यान्वयन से हमें प्रत्येक अनुरोध के बाद आसानी से पीएचपी को मारे बिना काम करने की अनुमति मिलती है। इस बीच, मैं इस पोस्ट को समाप्त कर रहा था, एक समान कार्यान्वयन वाले सुझाव पहले से ही सिम्फनी चैनल पर आ रहे हैं । और डेवलपर्स खुद इस तथ्य को नहीं छिपाते हैं कि संस्करण 2 के लॉन्च की शुरुआत के बाद से इस तरह का समाधान उनके दिमाग में गर्म रहा है।

लेकिन शब्दों से कर्मों की ओर चलो। सबसे पहले, हमें स्थापित और कॉन्फ़िगर किए गए nginx, php-cli 5.5.x, कंपोज़र और आपके सिम्फनी एप्लिकेशन के साथ आपके पसंदीदा लिनक्स वितरण की आवश्यकता है। यदि आपके पास हाथ में सिम्फनी एप्लिकेशन नहीं हैं, तो आप सिम्फनी वेबसाइट से एक नंगे इंस्टॉलेशन ले सकते हैं, जो एक उदाहरण देगा। यदि आप संगीतकार से परिचित नहीं हैं, तो आप संक्षेप में सतीस पर मेरे लेख की समीक्षा कर सकते हैं।

एक नया फ़ोल्डर बनाएँ, अगर परियोजना पहले से ही वहाँ है, तो उसके पास जाएँ:
mkdir fastapp && cd fastapp 

संगीतकार स्थापित करें:
 curl -sS https://getcomposer.org/installer | php 

हमने Symfony2.4.4 डाला:
 php composer.phar create-project symfony/framework-standard-edition symfdir/ 2.4.4 && mv symfdir/* ./ && rm -fr symfdir 

हमें मिलता है
 ls -l drwxrwxr-x 6 user user 4.0K Apr 30 11:25 app/ drwxrwxr-x 2 user user 4.0K Apr 30 11:25 bin/ drwxrwxr-x 3 user user 4.0K Mar 14 09:37 src/ drwxrwxr-x 13 user user 4.0K Apr 30 11:25 vendor/ drwxrwxr-x 3 user user 4.0K Apr 30 11:25 web/ -rw-rw-r-- 1 user user 2.0K Mar 14 09:37 composer.json -rw-rw-r-- 1 user user 56K Apr 30 11:25 composer.lock -rwxr-xr-x 1 user user 990K Apr 30 11:23 composer.phar* -rw-rw-r-- 1 user user 1.1K Mar 14 09:37 LICENSE -rw-rw-r-- 1 user user 5.7K Mar 14 09:37 README.md -rw-rw-r-- 1 user user 1.3K Mar 14 09:37 UPGRADE-2.2.md -rw-rw-r-- 1 user user 2.0K Mar 14 09:37 UPGRADE-2.3.md -rw-rw-r-- 1 user user 356 Mar 14 09:37 UPGRADE-2.4.md -rw-rw-r-- 1 user user 8.3K Mar 14 09:37 UPGRADE.md 


इन पंक्तियों को अपने कंपोजर में जोड़ें। json:
 { "repositories": [ { "type": "vcs", "url": "http://github.com/Imunhatep/rephp" }, { "type": "vcs", "url": "http://github.com/Imunhatep/php-pm" } ], "minimum-stability": "dev", "prefer-stable": true, "require": { "imunhatep/php-pm": "@dev" } } 

ऐसा कुछ देखने के लिए
 { "name": "symfony/framework-standard-edition", "license": "MIT", "type": "project", "description": "The \"Symfony Standard Edition\" distribution", "autoload": { "psr-0": { "": "src/" } }, "repositories": [ { "type": "vcs", "url": "http://github.com/Imunhatep/rephp" }, { "type": "vcs", "url": "http://github.com/Imunhatep/php-pm" } ], "minimum-stability": "dev", "prefer-stable": true, "require": { "php": ">=5.5.3", "symfony/symfony": "~2.4", "doctrine/orm": "~2.2,>=2.2.3", "doctrine/doctrine-bundle": "~1.2", "twig/extensions": "~1.0", "symfony/assetic-bundle": "~2.3", "symfony/swiftmailer-bundle": "~2.3", "symfony/monolog-bundle": "~2.4", "sensio/distribution-bundle": "~2.3", "sensio/framework-extra-bundle": "~3.0", "sensio/generator-bundle": "~2.3", "incenteev/composer-parameter-handler": "~2.0", "imunhatep/php-pm": "@dev" }, "scripts": { "post-install-cmd": [ "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile" ], "post-update-cmd": [ "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile" ] }, "config": { "bin-dir": "bin" }, "extra": { "symfony-app-dir": "app", "symfony-web-dir": "web", "incenteev-parameters": { "file": "app/config/parameters.yml" }, "branch-alias": { "dev-master": "2.4-dev" } } } 


हम पैकेज अपडेट शुरू करते हैं:
 php composer.phar update 

हमें मिलता है
 Loading composer repositories with package information Updating dependencies (including require-dev) - Installing stack/builder (v1.0.1) Loading from cache - Installing react/promise (v2.0.0) Loading from cache - Installing guzzle/parser (v3.9.0) Loading from cache - Installing evenement/evenement (v2.0.0) Loading from cache - Installing react/react (v0.4.1) Loading from cache - Installing imunhatep/rephp (dev-master 13adf26) Cloning 13adf2697681a5954978ac56fe2c8fdf6a21dc4a - Installing imunhatep/php-pm (dev-master 02f44ec) Cloning 02f44ecb41ca5b4c81d4bb6087da7a0ed4964656 react/react suggests installing ext-libevent (Allows for use of a more performant event-loop implementation.) react/react suggests installing ext-libev (Allows for use of a more performant event-loop implementation.) react/react suggests installing ext-event (Allows for use of a more performant event-loop implementation.) Writing lock file Generating autoload files Updating the "app/config/parameters.yml" file Clearing the cache for the dev environment with debug true Installing assets using the hard copy option Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework Installing assets for Acme\DemoBundle into web/bundles/acmedemo Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution 


सिम्फनी कैश तैयार करना:
 php app/console cache:warmup --env=dev 

और हम वेब सर्वर शुरू करते हैं, जबकि केवल PHP का मतलब है और एक कॉपी में, बोलने के लिए परीक्षण करें। पोर्ट को स्वाद के लिए चुना जा सकता है:
 php bin/ppm start --workers 1 --port 8080 

हम जाँचते हैं कि आपके पसंदीदा ब्राउज़र में लोकलहोस्ट: 8080 खोलकर सब कुछ काम करता है। सिम्फनी से एक स्वागत योग्य पृष्ठ खुलना चाहिए, हालांकि चित्र नहीं दिखेंगे और सीएसएस लोड नहीं होगा। इस प्रकार, हमें एक PHP वेब सर्वर मिला है जो आने वाले HTTP अनुरोधों को संसाधित करता है और मरता नहीं है। लेकिन हमारे पास केवल 1 प्रक्रिया है, कोई स्टैटिक्स प्रसंस्करण नहीं है और कोई बैलेंसर नहीं है। जैसा कि कई लोगों ने अनुमान लगाया है, इसके लिए हमें nginx की आवश्यकता होगी।


हम अपने PHP सर्वर पर प्रॉक्सी डायनेमिक अनुरोधों के लिए nginx कॉन्फ़िगर करते हैं, साथ ही साथ एक बैलेंसर के रूप में कार्य करते हैं, और PHP के बिना स्टैटिक्स देते हैं:
 upstream backend { server 127.0.0.1:5501; server 127.0.0.1:5502; server 127.0.0.1:5503; server 127.0.0.1:5504; server 127.0.0.1:5505; server 127.0.0.1:5506; server 127.0.0.1:5507; server 127.0.0.1:5508; } server { root /path/to/symfony/web/; server_name fastapp.com; location / { # try to serve file directly, fallback to rewrite try_files $uri @rewriteapp; } location @rewriteapp { if (!-f $request_filename) { proxy_pass http://backend; break; } } } 

इस स्थिति में, server_name (fastapp.com) को / etc / मेजबान में पंजीकृत होना चाहिए:
 127.0.0.1 fastapp.com 

अब, ताकि हमारे PHP एप्लिकेशन में एन-संख्या की प्रक्रिया को मैन्युअल रूप से शुरू करने से परेशान न हों (प्रस्तुत नगनेक्स कॉन्फ़िगरेशन n = 8 से कॉन्फ़िगर किया गया है), हमारे प्रोजेक्ट फ़ोल्डर में जाएं और निष्पादित करें:
 cp vendor/imunhatep/rephp/ppm.json ./ 

हम ./ppm.json फ़ाइल को सही करते हैं:
 { "bootstrap": "\\PHPPM\\Bootstraps\\Symfony", "bridge": "HttpKernel", "appenv": "dev", "workers": 8, "port": 5501 } 

कभी-कभी परिवर्तनों के बाद आपको कैश को अपडेट करने की आवश्यकता होती है, शायद यह केवल मेरे मामले में है, क्योंकि एक लेख लिखते समय, कोड में परिवर्तन किए:
 app/console cache:warmup --env=dev 

हमारे PHP प्रोसेस मैनेजर को फिर से लॉन्च करें:
 php bin/ppm start 

हमें प्रतिक्रिया मिल रही है:
 8 slaves (5501, 5502, 5503, 5504, 5505, 5506, 5507, 5508) up and ready. 

सबसे पहले, हम ब्राउज़र में लोकलहोस्ट: 5501 लिंक की जांच करते हैं, अगर सब कुछ खुलता है, तो fastapp.com खोलने का प्रयास करें। चित्रों और सीएसएस के साथ सब कुछ खोलना चाहिए।

अब आप घेराबंदी या एब टूल से जला सकते हैं, जिससे चुनने के लिए:
 siege -qb -t 30S -c 128 http://fastapp.com/ 

एएमडी 8कोर, 8 आरएएम और फेडोरा 20 के साथ एक विकास मशीन पर मेरी (हेलोवर्ल्ड नहीं) सिम्फनी एप्लिकेशन के परीक्षण के कुछ परिणाम यहां दिए गए हैं।
Php 5.5.10, nginx + php-fpm के माध्यम से:

 siege -qb -t 30S -c 128 http://login.dev/signup Lifting the server siege... done. Transactions: 983 hits Availability: 100.00 % Elapsed time: 29.03 secs Data transferred: 4.57 MB Response time: 0.91 secs Transaction rate: 34.26 trans/sec Throughput: 0.16 MB/sec Concurrency: 124.23 Successful transactions: 983 Failed transactions: 0 Longest transaction: 1.81 Shortest transaction: 0.42 

ओएनजीसी के साथ php 5.5.10, nginx + php-fpm के माध्यम से सक्षम:

 siege -qb -t 30S -c 128 http://login.dev/signup Lifting the server siege... done. Transactions: 5298 hits Availability: 100.00 % Elapsed time: 29.54 secs Data transferred: 24.15 MB Response time: 0.70 secs Transaction rate: 179.35 trans/sec Throughput: 0.82 MB/sec Concurrency: 126.43 Successful transactions: 5298 Failed transactions: 0 Longest transaction: 1.68 Shortest transaction: 0.07 

ओएनजीसी के साथ php 5.5.10, nginx + ReactPHP + Coroutine eventloop के माध्यम से सक्षम:

 siege -qb -t 30S -c 128 http://fastlogin.dev/signup Lifting the server siege... done. Transactions: 30553 hits Availability: 100.00 % Elapsed time: 29.85 secs Data transferred: 157.63 MB Response time: 0.12 secs Transaction rate: 1023.55 trans/sec Throughput: 5.28 MB/sec Concurrency: 127.43 Successful transactions: 30553 Failed transactions: 0 Longest transaction: 0.76 Shortest transaction: 0.00 

हम समवर्ती अनुरोधों की संख्या को 256 तक बढ़ाते हैं।
ओएनजीसी के साथ एनपीएक्स + पीएचपी-एफपीएम के साथ पीएचपी ५.५.१० सक्षम

 siege -qb -t 30S -c 256 http://login.dev/signup siege aborted due to excessive socket failure; Transactions: 134 hits Availability: 10.48 % Elapsed time: 1.58 secs Data transferred: 0.78 MB Response time: 1.21 secs Transaction rate: 84.81 trans/sec Throughput: 0.49 MB/sec Concurrency: 102.93 Successful transactions: 134 Failed transactions: 1145 Longest transaction: 1.56 Shortest transaction: 0.00 

दुर्भाग्य से php-fpm गिर गया और 256 समवर्ती अनुरोधों के खिलाफ 32 प्रक्रियाओं की सीमा के साथ काम करने से इनकार कर दिया।
हम Php5.5.10 + ReactPHP + Coroutine Eventloop आज़माते हैं

 siege -qb -t 30S -c 256 http://fastlogin.dev/signup Lifting the server siege... done. Transactions: 29154 hits Availability: 100.00 % Elapsed time: 29.16 secs Data transferred: 150.40 MB Response time: 0.25 secs Transaction rate: 999.79 trans/sec Throughput: 5.16 MB/sec Concurrency: 252.70 Successful transactions: 29154 Failed transactions: 0 Longest transaction: 3.66 Shortest transaction: 0.00 

निष्कर्ष।


ReactPHP के माध्यम से सिम्फनी एप्लिकेशन चलाने का विचार मेरा नहीं है, मैंने उनके लेख से मार्क से उधार लिया, जिसके लिए उन्हें बहुत धन्यवाद। वैसे, उन्होंने अपने माप लिए और यहां तक ​​कि एचएचवीएम के साथ तुलना की। नीचे उनके लेख से एक चार्ट है:

मेरा योगदान nikic के काम के आधार पर एक ईवेंटलूप बनाने और सामान्य रूप से, व्यावहारिकता में, और साथ ही नए ईवेंटलूप के साथ ReactPHP को चलाने की बारीकियों को पूरा करने के लिए प्रक्रिया प्रबंधक को पूरा करने के लिए है। शायद pecl घटना के साथ, यह सब तेजी से काम करेगा, जाँच नहीं की। दुर्भाग्य से, मेरी वर्तमान परियोजनाएं कोड की आवश्यक गुणवत्ता के अनुरूप नहीं हैं, इसलिए ऑपरेटिंग समय "प्रयोगशाला" की अलमारियों पर धूल जमा कर रहा है क्योंकि इस दृष्टिकोण में त्रुटि-मुक्त कोड की आवश्यकता है। यही है, PHP, वास्तव में, गिरने का कोई अधिकार नहीं है, और सर्वाहारी और गतिशील PHP किसी भी तरह से इसमें योगदान नहीं करता है। यह पीएम पीएम को जोड़कर गिरती प्रक्रियाओं को फिर से शुरू करने के लिए तय किया जा सकता है, और आप कोड में परिवर्तन की ट्रैकिंग भी जोड़ सकते हैं और प्रक्रियाओं को भी पुनरारंभ कर सकते हैं। लेकिन अभी तक मांग में नहीं है। इस आधार पर वेबसोकेट सर्वर भी लॉन्च किया जा सकता है। योजनाओं में क्या था, लेकिन यह वहीं रहा।

उसने पूरे सप्ताहांत के लिए इस तरह के सर्वर को लोड के तहत छोड़ दिया, कोई मेमोरी लीक नहीं थे। एक समस्या है कि न तो समय है और न ही देखने की जरूरत है: किसी कारण से, लोड होने के बाद, 1-2 कनेक्शन बंद नहीं रहते हैं। छोटे भार पर, कारण की पहचान करना संभव नहीं है, लेकिन बड़े भार के लिए यह पता लगाने के लिए समय बिताना आवश्यक है कि कारण की पहचान कैसे करें। अब तक, मैंने एक टाइमर जोड़ा है, जो हर 10 सेकंड में वैधता (संसाधन, संसाधन नहीं) के लिए वर्तमान कनेक्शन की जांच करता है और मृतकों को मारता है।

यह भी ध्यान देने योग्य है कि आवेदन, आदर्श रूप से, अतुल्यकालिक और रुकावट (उपज) की नई विशेषताओं को ध्यान में रखना चाहिए, और एक टुकड़े में निष्पादित नहीं किया जाएगा। गैर-अवरुद्ध कार्यक्षमता का उपयोग करना भी अच्छा होगा।

Source: https://habr.com/ru/post/In220393/


All Articles