পিএইচপি টাস্ক অ্যাসিঙ্ক্রোনালি চালান


144

আমি কিছুটা বড় ওয়েব অ্যাপ্লিকেশনটিতে কাজ করি এবং ব্যাকএন্ড বেশিরভাগ পিএইচপিতে থাকে। কোডটিতে বেশ কয়েকটি জায়গা রয়েছে যেখানে আমাকে কিছু কাজ শেষ করতে হবে, তবে আমি ব্যবহারকারীকে ফলাফলের জন্য অপেক্ষা করতে চাই না। উদাহরণস্বরূপ, একটি নতুন অ্যাকাউন্ট তৈরি করার সময়, আমি তাদের স্বাগত ইমেল প্রেরণ করা প্রয়োজন। তবে যখন তারা 'ফিনিশিং রেজিস্ট্রেশন' বোতামটি চাপবে তখন আমি ইমেলটি আসলে না আসা পর্যন্ত তাদের অপেক্ষা করতে চাই না, আমি কেবল প্রক্রিয়াটি শুরু করতে এবং এখনই ব্যবহারকারীর কাছে একটি বার্তা ফিরিয়ে দিতে চাই।

এখনও অবধি, কিছু জায়গায় আমি ব্যবহার করছি যা এক্সিকিউট () এর সাথে হ্যাকের মতো মনে হয়। মূলত:

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

যা কাজ করে বলে মনে হচ্ছে তবে এর থেকে আরও ভাল উপায় আছে কিনা তা নিয়ে আমি ভাবছি। আমি মাইএসকিউএল টেবিলের কাজগুলি সারি করার ব্যবস্থা এবং একটি পৃথক দীর্ঘ-চলমান পিএইচপি স্ক্রিপ্ট লেখার বিষয়ে বিবেচনা করছি যা সেকেন্ডে একবারে সেই টেবিলটি অনুসন্ধান করে এবং এটি খুঁজে পাওয়া কোনও নতুন কার্য সম্পাদন করে। যদি আমার প্রয়োজন হয় তবে ভবিষ্যতে বেশ কয়েকটি কর্মী মেশিনের মধ্যে আমাকে কাজগুলি বিভক্ত করার সুযোগ দেওয়ারও সুবিধা হবে।

আমি কি আবার চাকাটি আবিষ্কার করছি? এক্সিকিউটি () হ্যাক বা মাইএসকিউএল কিউ এর চেয়ে ভাল সমাধান কি আছে?

উত্তর:


80

আমি কুইউং পদ্ধতির ব্যবহার করেছি এবং এটি আপনার সার্ভারের লোড অলস না হওয়া পর্যন্ত এই প্রক্রিয়াটি স্থগিত করতে পারে পাশাপাশি আপনি যদি "জরুরী নয় এমন কাজগুলিকে সহজেই বিভাজন করতে পারেন তবে আপনার লোডকে বেশ কার্যকরভাবে পরিচালনা করতে দেবেন well

আপনার নিজের ঘূর্ণায়মান খুব জটিল নয়, এখানে যাচাই করার জন্য কয়েকটি অন্যান্য বিকল্প রয়েছে:

  • গিয়ারম্যান - এই উত্তরটি ২০০৯ সালে লেখা হয়েছিল এবং তার পর থেকে গিয়ারম্যান একটি জনপ্রিয় বিকল্প দেখায়, নীচে মন্তব্যগুলি দেখুন।
  • অ্যাক্টিভ কিউ আপনি যদি একটি পূর্ণ বিকাশযুক্ত ওপেন সোর্স বার্তার সারি চান want
  • জিরোমিকিউ - এটি একটি দুর্দান্ত শীতল সকেট লাইব্রেরি যা সকেট প্রোগ্রামিং নিজেই খুব বেশি চিন্তা না করে বিতরণ কোড লিখতে সহজ করে তোলে। আপনি এটি কোনও একক হোস্টের বার্তাগুলির কাতারে জন্য ব্যবহার করতে পারেন - আপনার ওয়েব অ্যাপ্লিকেশনটি এমন কোনও কিউতে কিছুটা চাপ দিতে পারে যা ধারাবাহিকভাবে চলমান কনসোল অ্যাপ্লিকেশনটি পরবর্তী উপযুক্ত সুযোগটিতে গ্রাস করবে
  • beanstalkd - এই উত্তরটি লেখার সময় এটির একটি খুঁজে পেয়েছিল তবে আকর্ষণীয় দেখাচ্ছে
  • ড্রপার একটি পিএইচপি ভিত্তিক বার্তা সারি প্রকল্প, তবে সেপ্টেম্বর 2010 থেকে সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয়নি
  • পিএইচপি-এনকুই হ'ল একটি সাম্প্রতিক (2017) রক্ষণাবেক্ষণযোগ্য বিভিন্ন রেখাচিত্রের চারপাশে র‌্যাপার
  • অবশেষে, বার্তা সন্ধানের জন্য ম্যাকচেড ব্যবহার সম্পর্কে একটি ব্লগ পোস্ট

আরেকটি, সম্ভবত সহজ, পদ্ধতির অবজ্ঞা - ইউজার_অবার্ট ব্যবহার করা - একবার আপনি পৃষ্ঠাটি ব্যবহারকারীর কাছে পাঠিয়ে দিলে , অকাল সমাপ্তির ভয় ছাড়াই আপনি আপনার চূড়ান্ত প্রক্রিয়াজাতকরণটি করতে পারেন, যদিও এটি ব্যবহারকারীর পৃষ্ঠার বোঝা দীর্ঘায়িত করার জন্য প্রভাব ফেলেছে though দৃষ্টিকোণ।


এই সব টিপস এর জন্য ধন্যবাদ. উপেক্ষা_ইউজার_অবার্ট সম্পর্কে সুনির্দিষ্টটি আমার ক্ষেত্রে সত্যিই সহায়তা করে না, আমার পুরো লক্ষ্যটি ব্যবহারকারীর জন্য অপ্রয়োজনীয় বিলম্ব এড়ানো।
ডেভর

2
আপনি যদি আপনার "নিবন্ধের জন্য ধন্যবাদ" প্রতিক্রিয়াতে বিষয়বস্তু-দৈর্ঘ্য এইচটিটিপি শিরোনাম সেট করে থাকেন তবে নির্দিষ্ট সংখ্যক বাইট পাওয়ার পরে ব্রাউজারটির সংযোগটি বন্ধ করা উচিত। এটি শেষ ব্যবহারকারী অপেক্ষা না করে সার্ভার সাইড প্রক্রিয়াটি চালিয়ে যায় (ধরে নেওয়া হবে যে উপেক্ষা_সারণকারী সেটটি সেট করা আছে)। অবশ্যই আপনাকে শিরোনামগুলি রেন্ডার করার আগে আপনার প্রতিক্রিয়া সামগ্রীর আকার গণনা করতে হবে তবে সংক্ষিপ্ত প্রতিক্রিয়াগুলির পক্ষে এটি বেশ সহজ।
পিটার

1
গিয়ারম্যান ( gearman.org ) একটি দুর্দান্ত ওপেন সোর্স বার্তা সারি যা ক্রস প্ল্যাটফর্ম। আপনি সি, পিএইচপি, পার্ল বা অন্য যে কোনও ভাষাতেই শ্রমিক লিখতে পারেন। মাইএসকিউএলের জন্য গিয়ারম্যান ইউডিএফ প্লাগইন রয়েছে এবং আপনি পিএইচপি বা গিয়ারম্যান পিয়ার ক্লায়েন্ট থেকে নেট_গিয়ারম্যান ব্যবহার করতে পারেন।
জাস্টিন সোয়ানহার্ট

গিয়ারম্যান হ'ল আমি আজ (2015) তে কোনও কাস্টম ওয়ার্ক কুইউিং সিস্টেমের বিষয়ে সুপারিশ করব।
পিটার

অন্য বিকল্পটি হ'ল একটি অনুরোধ পরিচালনা করতে নোড জেএস সার্ভার সেট আপ করা এবং এর মধ্যে একটি কার্যের সাথে একটি দ্রুত প্রতিক্রিয়া ফিরিয়ে দেওয়া। নোড জেএস স্ক্রিপ্টের ভিতরে থাকা অনেকগুলি বিষয় এইচএনপি অনুরোধের মতো অ্যাসিনক্রোনাকৃতভাবে কার্যকর করা হয়।
জোর্ডন

22

যখন আপনি কেবল প্রতিক্রিয়ার জন্য অপেক্ষা না করেই এক বা একাধিক এইচটিটিপি অনুরোধগুলি কার্যকর করতে চান, তখন একটি পিএইচপি সমাধানও রয়েছে।

কলিং স্ক্রিপ্টে:

$socketcon = fsockopen($host, 80, $errno, $errstr, 10);
if($socketcon) {   
   $socketdata = "GET $remote_house/script.php?parameters=... HTTP 1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n";      
   fwrite($socketcon, $socketdata); 
   fclose($socketcon);
}
// repeat this with different parameters as often as you like

স্ক্রিপ্ট.এফপি নামে, আপনি প্রথম লাইনে এই পিএইচপি ফাংশন শুরু করতে পারেন:

ignore_user_abort(true);
set_time_limit(0);

এইচটিপি সংযোগ বন্ধ হয়ে গেলে সময় সীমা ছাড়াই স্ক্রিপ্টটি চলতে থাকে।


পিএইচপি নিরাপদ মোডে চললে সেট_টাইম_লিমিটের কোনও প্রভাব নেই
ব্যাপটিস্ট পার্নেট

17

কাঁটাচামচ প্রক্রিয়াগুলির আরেকটি উপায় হ'ল কার্লের মাধ্যমে। আপনি আপনার ওয়েব সাইট হিসাবে অভ্যন্তরীণ কাজগুলি সেট আপ করতে পারেন। উদাহরণ স্বরূপ:

তারপরে আপনার ব্যবহারকারীর অ্যাক্সেস প্রাপ্ত স্ক্রিপ্টগুলিতে পরিষেবাতে কল করা:

$service->addTask('t1', $data); // post data to URL via curl

আপনার পরিষেবাটি মাইএসকিএল বা আপনার পয়েন্টটি যা পছন্দ করে তা দিয়ে সারিবদ্ধ কাজের সারিতে নজর রাখতে পারে: এটি সমস্ত পরিষেবাটির মধ্যে আবৃত এবং আপনার স্ক্রিপ্টটি কেবল ইউআরএল গ্রহণ করছে। এটি আপনাকে প্রয়োজন হলে পরিষেবাটিকে অন্য মেশিন / সার্ভারে স্থানান্তরিত করতে মুক্তি দেয় (অর্থাত্ সহজেই স্কেলযোগ্য)।

HTTP অনুমোদন বা একটি কাস্টম অনুমোদনের স্কিম যুক্ত করা (যেমন অ্যামাজনের ওয়েব পরিষেবাদি) আপনাকে অন্য লোক / পরিষেবাগুলি (যদি আপনি চান) দ্বারা গ্রাস করার জন্য আপনার কাজগুলি খুলতে দেয় এবং আপনি এটিকে আরও গ্রহণ করতে পারেন এবং ট্র্যাক রাখতে শীর্ষে একটি মনিটরিং পরিষেবা যুক্ত করতে পারেন সারি এবং কার্য স্থিতি।

এটি সেট-আপ কাজের জন্য কিছুটা সময় নেয় তবে অনেক সুবিধা রয়েছে।


1
আমি এই পদ্ধতির পছন্দ করি না কারণ এটি ওয়েব সার্ভারটি ওভারলোড করে
ওভেড ইয়্যাভিন

7

আমি একটি প্রকল্পের জন্য বিনস্টালকডি ব্যবহার করেছি এবং আবার পরিকল্পনা করেছি। আমি এটি অ্যাসিক্রোনাস প্রক্রিয়া চালানোর জন্য একটি দুর্দান্ত উপায় বলে মনে করেছি।

আমি এটি দিয়ে বেশ কয়েকটি কাজ করেছি:

  • চিত্রের আকার পরিবর্তন - এবং একটি হালকা লোডযুক্ত সারিটি সিএলআই-ভিত্তিক পিএইচপি স্ক্রিপ্টে চলে যাওয়ার সাথে, বৃহত্তর (2 এমবি +) চিত্রের আকার পরিবর্তন করে ঠিক একটি কাজ করেছে, তবে একটি মোড_এইচপিপি উদাহরণের মধ্যে একই চিত্রকে পুনরায় আকার দেওয়ার চেষ্টা মেমরি-স্পেস সমস্যাগুলিতে নিয়মিত চলছে (আমি পিএইচপি প্রক্রিয়াটি 32MB তে সীমাবদ্ধ করে রাখুন এবং পুনরায় আকার দেওয়ার চেয়ে আরও বেশি কিছু লাগল)
  • অদূর ভবিষ্যতের চেকস - beanstalkd এর জন্য বিলম্ব রয়েছে (কেবলমাত্র X সেকেন্ড পরে চালানোর জন্য এই কাজটি উপলভ্য করুন) - তাই আমি কোনও অনুষ্ঠানের জন্য 5 বা 10 টি চেক বন্ধ করতে পারি, কিছুক্ষণ পরে

আমি একটি 'সুন্দর' ইউআরএল ডিকোড করতে একটি জেনড-ফ্রেমওয়ার্ক ভিত্তিক সিস্টেম লিখেছি, উদাহরণস্বরূপ, কোনও চিত্রটিকে এটি আকার দেবে বলে পুনরায় আকার দিতে QueueTask('/image/resize/filename/example.jpg')। ইউআরএলটি প্রথমে একটি অ্যারে (মডিউল, নিয়ামক, ক্রিয়া, পরামিতি) তে ডিকোড করা হয়েছিল এবং তারপরে ইনজেকশনের জন্য কাতারে নিজেই JSON এ রূপান্তরিত হয়েছিল।

একটি দীর্ঘ চলমান ক্লিপ স্ক্রিপ্ট তারপরে সারি থেকে কাজটি তুলেছে, এটি চালিয়েছে (জেন্ড_রোউটার_সিম্পেলের মাধ্যমে), এবং প্রয়োজনে ওয়েবসাইট পিএইচপি যখন প্রয়োজন হয় তখন তা সংগ্রহ করার জন্য মেমচেডে তথ্য রাখে।

একটি রিঙ্কেল আমি এনেছিলাম যে ক্লিপ-স্ক্রিপ্টটি পুনরায় চালু করার আগে কেবল 50 টি লুপের জন্য দৌড়েছিল, তবে এটি যদি পরিকল্পনা অনুসারে পুনরায় আরম্ভ করতে চায় না তবে তা অবিলম্বে এটি করতে হবে (বাশ-স্ক্রিপ্টের মাধ্যমে চালানো হচ্ছে)। যদি কোনও সমস্যা হয়ে থাকে এবং আমি exit(0)(এর জন্য ডিফল্ট মান exit;বা die();) এটি প্রথমে কয়েক সেকেন্ডের জন্য বিরতি দেয়।


আমি বিনস্টালকডির চেহারা পছন্দ করি, একবার তারা দৃistence়তা যোগ করে তবে আমি মনে করি এটি নিখুঁত হবে।
ডেভর

ইতিমধ্যে কোডবেসে রয়েছে এবং স্থিতিশীল হচ্ছে। আমি 'নামকৃত চাকরি'র অপেক্ষায় রয়েছি, তাই আমি সেখানে জিনিস ফেলে দিতে পারি, তবে জানি যে ইতিমধ্যে সেখানে থাকলে এটি যুক্ত করা হবে না। নিয়মিত ইভেন্টের জন্য ভাল।
আলিস্টার বুলম্যান 11

"অলিস্টারবুলমান আপনি কি" দীর্ঘমেয়াদী ক্লাইপ স্ক্রিপ্টের জন্য সারি থেকে কাজটি বেছে নিয়েছিলেন "এর জন্য আরও তথ্য বা উদাহরণ দিতে পারেন? আমি আমার অ্যাপ্লিকেশনটির জন্য এই জাতীয় একটি ক্লিপ স্ক্রিপ্ট তৈরি করার চেষ্টা করছি।
সসি বর্ণ কুমার

7

যদি এটি কেবল ব্যয়বহুল কাজগুলি সরবরাহ করার প্রশ্নে, পিএইচপি-এফপিএম সমর্থিত হয় তবে কেন fastcgi_finish_request()ফাংশনটি ব্যবহার করবেন না ?

এই ফাংশনটি ক্লায়েন্টের সমস্ত প্রতিক্রিয়া ডেটা ফ্লাশ করে এবং অনুরোধটি শেষ করে। এটি ক্লায়েন্টের সংযোগটি খোলা না রেখে সময় সাধ্য কাজগুলি সম্পাদন করার অনুমতি দেয়।

আপনি সত্যই এইভাবে অ্যাসিঙ্ক্রোনসিটি ব্যবহার করবেন না:

  1. প্রথমে আপনার সমস্ত মূল কোড তৈরি করুন।
  2. সম্পাদন fastcgi_finish_request()
  3. সমস্ত ভারী জিনিস তৈরি করুন।

আবার পিএইচপি-এফপিএম দরকার।


5

এখানে আমার ওয়েব অ্যাপ্লিকেশনটির জন্য কোড করা একটি সাধারণ ক্লাস। এটি পিএইচপি স্ক্রিপ্ট এবং অন্যান্য স্ক্রিপ্টগুলি কাঁটাচামচ করার অনুমতি দেয়। ইউনিক্স এবং উইন্ডোজে কাজ করে।

class BackgroundProcess {
    static function open($exec, $cwd = null) {
        if (!is_string($cwd)) {
            $cwd = @getcwd();
        }

        @chdir($cwd);

        if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
            $WshShell = new COM("WScript.Shell");
            $WshShell->CurrentDirectory = str_replace('/', '\\', $cwd);
            $WshShell->Run($exec, 0, false);
        } else {
            exec($exec . " > /dev/null 2>&1 &");
        }
    }

    static function fork($phpScript, $phpExec = null) {
        $cwd = dirname($phpScript);

        @putenv("PHP_FORCECLI=true");

        if (!is_string($phpExec) || !file_exists($phpExec)) {
            if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
                $phpExec = str_replace('/', '\\', dirname(ini_get('extension_dir'))) . '\php.exe';

                if (@file_exists($phpExec)) {
                    BackgroundProcess::open(escapeshellarg($phpExec) . " " . escapeshellarg($phpScript), $cwd);
                }
            } else {
                $phpExec = exec("which php-cli");

                if ($phpExec[0] != '/') {
                    $phpExec = exec("which php");
                }

                if ($phpExec[0] == '/') {
                    BackgroundProcess::open(escapeshellarg($phpExec) . " " . escapeshellarg($phpScript), $cwd);
                }
            }
        } else {
            if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
                $phpExec = str_replace('/', '\\', $phpExec);
            }

            BackgroundProcess::open(escapeshellarg($phpExec) . " " . escapeshellarg($phpScript), $cwd);
        }
    }
}

4

আমি এখন কয়েক বছর ধরে একই পদ্ধতি ব্যবহার করে আসছি এবং আমি এর চেয়ে ভাল কিছু দেখিনি বা পাইনি। লোকেরা যেমন বলেছে, পিএইচপি একক থ্রেডযুক্ত, তাই আপনি আরও কিছু করতে পারেন না।

আমি আসলে এটিতে একটি অতিরিক্ত স্তর যুক্ত করেছি এবং এটি প্রক্রিয়া আইডি পেয়ে এবং সঞ্চয় করে চলেছে। এটি আমাকে অন্য পৃষ্ঠায় পুনঃনির্দেশিত করতে এবং প্রক্রিয়াটি সম্পূর্ণ হয়েছে কিনা তা পরীক্ষা করতে AJAX ব্যবহার করে ব্যবহারকারীকে সেই পৃষ্ঠায় বসতে দেয় (প্রক্রিয়া আইডি আর বিদ্যমান নেই)। এটি স্ক্রিপ্টের দৈর্ঘ্যের কারণে ব্রাউজারের সময়সীমা শেষ হতে পারে এমন ক্ষেত্রে এটি দরকারী তবে পরবর্তী পদক্ষেপের আগে ব্যবহারকারীর সেই স্ক্রিপ্টটি শেষ হওয়ার অপেক্ষা করা উচিত। (আমার ক্ষেত্রে এটি সিএসভির সাথে বৃহত জিপ ফাইলগুলি প্রক্রিয়া করছিল এমন ফাইলগুলির মতো যা ডাটাবেসে 30,000 রেকর্ড যোগ করে যার পরে ব্যবহারকারীর কিছু তথ্য নিশ্চিত হওয়া দরকার।)

আমি রিপোর্ট তৈরির জন্যও একই জাতীয় প্রক্রিয়া ব্যবহার করেছি। আমি নিশ্চিত না যে আমি কোনও ইমেলের মতো "ব্যাকগ্রাউন্ড প্রসেসিং" ব্যবহার করব, যদি না ধীর এসএমটিপিতে কোনও আসল সমস্যা না থাকে। পরিবর্তে আমি একটি সারি হিসাবে একটি টেবিল ব্যবহার করতে পারি এবং তারপরে একটি প্রক্রিয়া থাকে যা প্রতি মিনিটে সারির মধ্যে ইমেলগুলি প্রেরণে চালিত হয়। আপনার দুবার বা অনুরূপ অন্যান্য সমস্যা ইমেল প্রেরণের বিষয়ে সতর্ক হতে হবে। আমি অন্যান্য কাজের জন্যও একই ধরণের ক্রাইং প্রক্রিয়া বিবেচনা করব।


1
আপনার প্রথম বাক্যে আপনি কোন পদ্ধতিটি উল্লেখ করছেন?
সাইমন পূর্ব

3

পিএইচপি করেছেন multithreading, তার ঠিক ডিফল্টরূপে সক্রিয় করা, সেখানে একটি এক্সটেনশন বলা হয় pthreads যা ঠিক তাই করছে। আপনার যদিও জেডটিএসের সাথে সংকলিত পিএইচপি দরকার হবে। (থ্রেড নিরাপদ) লিঙ্কগুলি:

উদাহরণ

অন্য টিউটোরিয়াল

pthreads PECL এক্সটেনশন


2

রোজোকার পরামর্শ অনুসারে সিআরএল ব্যবহার করা দুর্দান্ত ধারণা।

এখানে একটি উদাহরণ। স্ক্রিপ্টটি পটভূমিতে চলাকালীন আপনি টেক্সট.এসটিএসটি পর্যবেক্ষণ করতে পারেন:

<?php

function doCurl($begin)
{
    echo "Do curl<br />\n";
    $url = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    $url = preg_replace('/\?.*/', '', $url);
    $url .= '?begin='.$begin;
    echo 'URL: '.$url.'<br>';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    echo 'Result: '.$result.'<br>';
    curl_close($ch);
}


if (empty($_GET['begin'])) {
    doCurl(1);
}
else {
    while (ob_get_level())
        ob_end_clean();
    header('Connection: close');
    ignore_user_abort();
    ob_start();
    echo 'Connection Closed';
    $size = ob_get_length();
    header("Content-Length: $size");
    ob_end_flush();
    flush();

    $begin = $_GET['begin'];
    $fp = fopen("text.txt", "w");
    fprintf($fp, "begin: %d\n", $begin);
    for ($i = 0; $i < 15; $i++) {
        sleep(1);
        fprintf($fp, "i: %d\n", $i);
    }
    fclose($fp);
    if ($begin < 10)
        doCurl($begin + 1);
}

?>

2
উত্স কোডটি মন্তব্য করা হলে এটি সত্যই সহায়তা করবে। আমার কী ধারণা নেই যে সেখানে কী চলছে এবং কোন অংশগুলি উদাহরণস্বরূপ এবং কোন অংশগুলি আমার নিজের উদ্দেশ্যে পুনরায় ব্যবহারযোগ্য।
টমাস টেম্পেলম্যান

1

দুর্ভাগ্যক্রমে পিএইচপি-তে কোনও ধরণের নেটিভ থ্রেডিং ক্ষমতা নেই। সুতরাং আমি মনে করি এক্ষেত্রে আপনার যা করতে চান তা করার জন্য আপনার কোনও ধরণের কাস্টম কোড ব্যবহার করা ছাড়া বিকল্প নেই।

আপনি যদি পিএইচপি থ্রেডিং স্টাফের জন্য নেট ঘুরে দেখেন তবে কিছু লোক পিএইচপি-তে থ্রেড অনুকরণ করার উপায় নিয়ে এসেছেন।


1

আপনি যদি আপনার "নিবন্ধের জন্য ধন্যবাদ" প্রতিক্রিয়াতে বিষয়বস্তু-দৈর্ঘ্য এইচটিটিপি শিরোনাম সেট করে থাকেন তবে নির্দিষ্ট সংখ্যক বাইট পাওয়ার পরে ব্রাউজারটির সংযোগটি বন্ধ করা উচিত। এটি সার্ভারের পাশের প্রক্রিয়াটি চলমান ছেড়ে দেয় (ধরে নেওয়া যায় যে অগ্রাহ্য_উজার_আবার্ট সেট রয়েছে) সুতরাং এটি শেষ ব্যবহারকারী অপেক্ষা না করেই কাজ শেষ করতে পারে।

অবশ্যই আপনাকে শিরোনামগুলি রেন্ডার করার আগে আপনার প্রতিক্রিয়া সামগ্রীর আকারের গণনা করতে হবে তবে সংক্ষিপ্ত প্রতিক্রিয়াগুলির জন্য এটি বেশ সহজ (স্ট্রিংয়ে আউটপুট লিখুন, কল স্ট্রেন (), কল শিরোনাম (), রেন্ডার স্ট্রিং)।

এই পদ্ধতির আপনাকে "সামনের প্রান্ত" সারিটি পরিচালনা করতে বাধ্য না করার সুবিধা রয়েছে এবং যদিও রেসিং এইচটিটিপি শিশু প্রসেসকে একে অপরের দিকে পদবিন্যাস থেকে বিরত রাখতে আপনার পিছনের প্রান্তে কিছু কাজ করার প্রয়োজন হতে পারে, এটি এমন কিছু যা আপনার ইতিমধ্যে করার দরকার ছিল যাইহোক,


এটি কাজ করে না বলে মনে হচ্ছে। যখন আমি তখন ব্যবহার করি header('Content-Length: 3'); echo '1234'; sleep(5);যদিও ব্রাউজারটি কেবল 3 টি অক্ষর নেয়, তবুও প্রতিক্রিয়াটি দেখানোর আগে এটি 5 সেকেন্ডের জন্য অপেক্ষা করে। আমি কী মিস করছি?
টমাস টেম্পেলম্যান

@ থমাস টেম্পেলম্যান - আউটপুটটি অবিলম্বে রেন্ডার করতে বাধ্য করার জন্য আপনার সম্ভবত ফ্লাশ () কল করতে হবে, অন্যথায় আপনার স্ক্রিপ্টটি প্রস্থান না করা বা বাফারটি ফ্লাশ করার জন্য পর্যাপ্ত ডেটা এসটিডিওউটে না পাঠানো পর্যন্ত আউটপুটটি বাফার হবে।
পিটার

আমি ইতিমধ্যে ফ্লাশ করার জন্য অনেক উপায়ে চেষ্টা করেছি, এখানে এসও তে পাওয়া যায়। কোন সাহায্য। এবং ডেটাগুলি অ-গিজিপযুক্ত প্রেরণ করা হয়েছে বলে মনে হয়, যেমনটি কেউ বলতে পারে phpinfo()। কেবলমাত্র অন্য একটি জিনিস যা আমি কল্পনা করতে পারি তা হ'ল আমাকে প্রথমে ন্যূনতম বাফার আকারে পৌঁছানো দরকার, যেমন 256 বা তার বেশি বাইট।
টমাস টেম্পেলম্যান

@ থমাস টেম্পেলম্যান - জিজিপ সম্পর্কে আপনার প্রশ্নে বা আমার উত্তরে আমি কিছুই দেখতে পাচ্ছি না (জটিলতার স্তর যুক্ত করার আগে প্রথমে সবচেয়ে সহজ পরিস্থিতিটি কাজ করা বোধগম্য হয়)। যখন সার্ভারটি আসলে ডেটা প্রেরণ করে তখন তা প্রতিষ্ঠিত করার জন্য আপনি ব্রাউজার প্লাগইনের একটি প্যাকেট স্নিফার ব্যবহার করতে পারেন (যেমন ফিডলার, ট্যাম্পারডাটা ইত্যাদি)। তারপরে, যদি আপনি দেখতে পান যে ফ্লাশিং নির্বিশেষে ওয়েবসার্ভার প্রস্থান অবধি সমস্ত স্ক্রিপ্ট আউটপুট ধরে রেখেছে, তবে আপনাকে আপনার ওয়েবসারভার কনফিগারেশনটি সংশোধন করতে হবে (আপনার পিএইচপি স্ক্রিপ্ট সে ক্ষেত্রে কিছুই করতে পারে না)।
পিটার

আমি একটি ভার্চুয়াল ওয়েব পরিষেবা ব্যবহার করি, সুতরাং এর কনফিগারেশনের উপর আমার খুব কম নিয়ন্ত্রণ রয়েছে। আমি অপরাধী কী হতে পারে সে সম্পর্কে অন্যান্য পরামর্শগুলি সন্ধান করার জন্য আশাবাদী ছিলাম তবে মনে হচ্ছে আপনার উত্তরটি সর্বজনীনভাবে প্রযোজ্য নয় যতটা দেখা যাচ্ছে। স্পষ্টতই অনেক কিছুই ভুল হতে পারে। আপনার সমাধান অবশ্যই এখানে দেওয়া সমস্ত অন্যান্য জবাব চেয়ে বাস্তবায়ন করা অনেক সহজ। খুব খারাপ এটি আমার পক্ষে কাজ করে না।
টমাস টেম্পেলম্যান

1

আপনি সম্পূর্ণ প্রস্ফুটিত ActiveMQ না চান তাহলে, আমার বিবেচনায় সুপারিশ RabbitMQ । রাবিট এমকিউ হ'ল লাইটওয়েট মেসেজিং যা এএমকিউ স্ট্যান্ডার্ড ব্যবহার করে ।

আমি পিএইচপি-এমকিপিপ্লিব - এএমকিপি ভিত্তিক বার্তা দালালদের অ্যাক্সেস করার জন্য একটি জনপ্রিয় এএমকিউ ক্লায়েন্ট লাইব্রেরিও সন্ধান করার পরামর্শ দিই ।


0

আমি মনে করি আপনার এই কৌশলটি ব্যবহার করা উচিত, এটি আপনার পৃষ্ঠা হিসাবে যতগুলি পৃষ্ঠাগুলি পছন্দ করে ততটুকু কল করতে সাহায্য করবে প্রতিটি পৃষ্ঠার প্রতিক্রিয়াটিকে অযৌক্তিক হিসাবে অপেক্ষা না করে একবারে স্বাধীনভাবে চলবে।

কর্নজেজপেজ.এফপি // মূল পৃষ্ঠা

    <?php

post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue");
//post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue2");
//post_async("http://localhost/projectname/otherpage.php", "Keywordname=anyValue");
//call as many as pages you like all pages will run at once independently without waiting for each page response as asynchronous.
            ?>
            <?php

            /*
             * Executes a PHP page asynchronously so the current page does not have to wait for it to     finish running.
             *  
             */
            function post_async($url,$params)
            {

                $post_string = $params;

                $parts=parse_url($url);

                $fp = fsockopen($parts['host'],
                    isset($parts['port'])?$parts['port']:80,
                    $errno, $errstr, 30);

                $out = "GET ".$parts['path']."?$post_string"." HTTP/1.1\r\n";//you can use POST instead of GET if you like
                $out.= "Host: ".$parts['host']."\r\n";
                $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
                $out.= "Content-Length: ".strlen($post_string)."\r\n";
                $out.= "Connection: Close\r\n\r\n";
                fwrite($fp, $out);
                fclose($fp);
            }
            ?>

testpage.php

    <?
    echo $_REQUEST["Keywordname"];//case1 Output > testValue
    ?>

পিএস: আপনি যদি লুপ হিসাবে ইউআরএল প্যারামিটারগুলি প্রেরণ করতে চান তবে এই উত্তরটি অনুসরণ করুন: https://stackoverflow.com/a/41225209/6295712


0

exec()সার্ভারে কার্ল ব্যবহার করে বা সরাসরি অন্য কোনও সার্ভারে নতুন প্রক্রিয়া তৈরি করা মোটেও ভালভাবে স্কেল করে না, যদি আমরা এক্সিকিউট করতে যাই তবে আপনি মূলত আপনার সার্ভারটি দীর্ঘ চলমান প্রক্রিয়াগুলিতে পূরণ করছেন যা অন্যান্য অ ওয়েব ওয়েব সার্ভারগুলি পরিচালনা করতে পারে, এবং কার্ল ব্যবহার করে অন্য সার্ভারের সাথে সম্পর্ক স্থাপন করা যদি না আপনি কোনও প্রকার লোড ব্যালেন্সিং তৈরি করেন।

আমি কয়েকটি পরিস্থিতিতে গিয়ারম্যানকে ব্যবহার করেছি এবং এই ধরণের ব্যবহারের ক্ষেত্রে এটি আরও ভাল। আমি সার্ভারের দ্বারা করা সমস্ত কাজের সারিবদ্ধভাবে পরিচালনা করার জন্য এবং কর্মী সার্ভারগুলিকে স্পিন আপ করার জন্য একক জব সারিবদ্ধ সার্ভার ব্যবহার করতে পারি, যার প্রত্যেকটি প্রয়োজন অনুসারে কর্মী প্রক্রিয়াতে যতগুলি উদাহরণ চালাতে পারে এবং সংখ্যা বাড়িয়ে তুলতে পারে কর্মী সার্ভারগুলি প্রয়োজন অনুসারে এবং যখন প্রয়োজন হয় না তখন সেগুলি সরিয়ে ফেলুন। এটি আমার প্রয়োজন অনুসারে কর্মী প্রক্রিয়াগুলি পুরোপুরি বন্ধ করে দিন এবং কর্মীরা অনলাইনে ফিরে না আসা পর্যন্ত কাজ সারি করে দিন।


-4

পিএইচপি হ'ল একক থ্রেডেড ভাষা, সুতরাং এটির ব্যবহার execবা ব্যবহার ব্যতীত অ্যাসিক্রোনাস প্রক্রিয়া শুরু করার কোনও আনুষ্ঠানিক উপায় নেই popen। এখানে একটি ব্লগ পোস্ট আছে । মাইএসকিউএল-এর একটি সারির জন্য আপনার ধারণাটিও একটি ভাল ধারণা।

আপনার নির্দিষ্ট প্রয়োজনীয়তা এখানে ব্যবহারকারীকে ইমেল প্রেরণের জন্য। আমি কেন আগ্রহী যে আপনি কেন এটি অবিচ্ছিন্নভাবে করার চেষ্টা করছেন যেহেতু ইমেল প্রেরণ করা একটি তুচ্ছ এবং তাত্পর্যপূর্ণ কাজ। আমি মনে করি আপনি যদি প্রচুর ইমেল প্রেরণ করছেন এবং আপনার আইএসপি আপনাকে স্প্যামিংয়ের সন্দেহের ভিত্তিতে বাধা দিচ্ছে, এটি সারিবদ্ধ হওয়ার এক কারণ হতে পারে, তবে এর বাইরে আমি এইভাবে এটি করার কোনও কারণ ভাবতে পারি না।


ইমেলটি কেবল একটি উদাহরণ ছিল, যেহেতু অন্যান্য কাজগুলি ব্যাখ্যা করা আরও জটিল, এবং এটি আসলে প্রশ্নের মূল বিষয় নয়। আমরা ইমেল প্রেরণে যেভাবে ব্যবহার করেছি, দূরবর্তী সার্ভারটি মেল না নেওয়া পর্যন্ত ইমেল কমান্ডটি ফিরে আসবে না। আমরা দেখতে পেলাম যে কিছু মেল সার্ভারগুলি মেল গ্রহণের আগে (সম্ভবত স্প্যামবোটের সাথে লড়াই করার জন্য) দীর্ঘ বিলম্ব (10-20 দ্বিতীয় বিলম্বের মতো) যুক্ত করার জন্য কনফিগার করা হয়েছিল এবং এই বিলম্বগুলি তখন আমাদের ব্যবহারকারীদের কাছে পৌঁছে দেওয়া হবে। এখন, আমরা মেলগুলি পাঠানোর জন্য সারিবদ্ধ করার জন্য একটি স্থানীয় মেলসভার ব্যবহার করছি, সুতরাং এই বিশেষটি প্রয়োগ হয় না, তবে আমাদের অনুরূপ প্রকৃতির অন্যান্য কাজ রয়েছে।
ডেভর

উদাহরণস্বরূপ: এসএসএল এবং পোর্ট 465 সহ গুগল অ্যাপস এসএমটিপি এর মাধ্যমে ইমেল প্রেরণ করা স্বাভাবিকের চেয়ে বেশি সময় নেয়।
জিস্টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.