পিএইচপি কি থ্রেডিং আছে?


130

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


pcntl_fork()এপাচে ফোন করা হলে এই ( ) কাজ করবে কিনা কেউ জানেন ?
জোশ কে

এটি অবিশ্বাস্যভাবে পুরানো, তবে আমার কাছে একটি উত্তর আছে যা আসলে পিএইচপি তে থ্রেডিং সরবরাহ করে (লিঙ্কগুলির জন্য নীচে দেখুন)।
অ্যালেক গর্জে

তারা কোনও সার্ভার পরিবেশ থেকে কাঁটাচামচ কল না করার পরামর্শ দেয়। আমি তাদের দোষ দিচ্ছি না তবে, pcntl_fork পিএইচপি থ্রেডিংয়ের জন্য সেরা সমাধান বলে মনে হয়।
just_wes

হ্যাঁ আপনার একটি অ্যাপাচি 2 পিএইচপি প্রক্রিয়া কাঁটাচামচ করা উচিত নয়।
andho

2
ব্যবহারের pthreads যাদুমন্ত্র মত কাজ করে
বাবা

উত্তর:


40

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


1
আমি যা ভেবেছিলাম. আমি পুরানো পোস্টগুলির একগুচ্ছ দেখতে পেয়েছি এবং না, পিএইচপিএন.টে কিছুই দেখলাম, তাই এটি আমার চিন্তাভাবনা ছিল। এটি নিশ্চিত করার জন্য ধন্যবাদ।
থমাস

2
হ্যাঁ, পিইসিএল প্যাকেজটি এক প্রকারের জ্বালানী - আমি এটির পাশাপাশি দৌড়েছি তবে এর আগে কিছুই আসে নি।
উইলকো

180

পাইথ্রেডস এক্সটেনশনের জন্য পিএইচপি ম্যানুয়াল থেকে :

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

এই শোনার মতো অবিশ্বাস্য, এটি সম্পূর্ণ সত্য। আজ, পিএইচপি এটি চেষ্টা করতে ইচ্ছুকদের জন্য বহু-থ্রেড করতে পারে।

পিএইচপি 4 এর প্রথম প্রকাশ, 22 মে 2000, পিএইচপি মাল্টি থ্রেডেড SAPI (সার্ভার এপিআই) পরিবেশে পৃথক থ্রেডে এর দোভাষীর একাধিক উদাহরণ কার্যকর করার জন্য একটি থ্রেড নিরাপদ আর্কিটেকচার সহ প্রেরণ করা হয়েছিল। গত 13 বছর ধরে, এই স্থাপত্যটির নকশাটি বজায় রাখা এবং উন্নত করা হয়েছে: এটি বিশ্বের সবচেয়ে বড় ওয়েবসাইটগুলিতে তখন থেকেই উত্পাদন ব্যবহৃত হচ্ছে।

ব্যবহারকারীর জমিতে থ্রেডিং পিএইচপি দলের পক্ষে কখনই উদ্বেগের বিষয় ছিল না এবং এটি আজও রয়েছে। আপনার বুঝতে হবে যে পৃথিবীতে যেখানে পিএইচপি এটি ব্যবসা করে, সেখানে ইতিমধ্যে স্কেলিংয়ের একটি সংজ্ঞায়িত পদ্ধতি রয়েছে - হার্ডওয়্যার যুক্ত করুন। বহু বছর ধরে পিএইচপি অস্তিত্ব পেয়েছে, হার্ডওয়্যার কম দামে এবং সস্তা হয়েছে এবং তাই পিএইচপি দলের পক্ষে এটি কম উদ্বেগের বিষয় হয়ে দাঁড়িয়েছে। এটি যখন সস্তা হচ্ছিল, এটি আরও অনেক বেশি শক্তিশালী হয়েছিল; আজ, আমাদের মোবাইল ফোন এবং ট্যাবলেটগুলির দ্বৈত এবং কোয়াড কোর আর্কিটেকচার এবং এটির সাথে প্রচুর পরিমাণে র‌্যাম রয়েছে, আমাদের ডেস্কটপগুলি এবং সার্ভারগুলিতে সাধারণত 8 বা 16 কোর, 16 এবং 32 গিগাবাইট র্যাম থাকে, যদিও আমরা সবসময় দুটি রাখতে সক্ষম না হই বাজেটের মধ্যে এবং দুটি ডেস্কটপ থাকা আমাদের বেশিরভাগের জন্য খুব কমই কার্যকর।

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

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

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

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

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

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

কেন পড়তে অনুলিপি এবং লিখিত অনুলিপি:

public function run() {
    ...
    (1) $this->data = $data;
    ...
    (2) $this->other = someOperation($this->data);
    ...
}

(3) echo preg_match($pattern, $replace, $thread->data);

(1) পাঠ, এবং লেখার লকটি যখন পাইথ্রেডস অবজেক্ট ডেটা স্টোরে রাখা হয়, তখন তথ্যটি তার মূল অবস্থান থেকে মেমরির মধ্যে অবজেক্ট স্টোর থেকে অনুলিপি করা হয়। pthreads ভেরিয়েবলের পুনঃনির্ধারণকে সামঞ্জস্য করে না, জেন্ডের যদি এর সাথে আরও কোনও উল্লেখ না থাকে তবে মূল ডেটাটি মুক্ত করতে সক্ষম হয়।

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

(3) প্রিগ_ম্যাচ করার সর্বশেষ যুক্তিটি ডেটা স্টোরের উল্লেখ করে, একটি পঠিত লক পাওয়া যায়, (1) এ সেট করা ডেটা আবার একটি জওয়ালে অনুলিপি করা হয়, আবার 0 এর একটি রি-কাউন্ট সহ লকটি প্রকাশ করা হয়, প্রিগ_ম্যাচ-এ কল চালিত হয় ডেটার অনুলিপি, এটি নিজেই মূল ডেটার একটি অনুলিপি।

জানা বিষয়গুলি:

  • অবজেক্ট স্টোরের হ্যাশ টেবিল যেখানে ডেটা সংরক্ষণ করা হয়, থ্রেড নিরাপদ,
    জেন্ডের মাধ্যমে পিএইচপি-র সাথে প্রেরিত TsHashTable এর উপর ভিত্তি করে।

  • অবজেক্ট স্টোরটিতে রিড ও রাইটিং লক রয়েছে, টিএসএইচশটবেলে একটি অতিরিক্ত অ্যাক্সেস লক সরবরাহ করা হয় যেমন প্রয়োজন হয় (এবং এটি, var_dump / মুদ্রণ_আর, পিএইচপি ইঞ্জিন তাদের রেফারেন্স করতে চাইলে সম্পত্তিগুলিতে সরাসরি অ্যাক্সেস করতে পারে) পাইথ্রেডগুলি TsHashTable কে ম্যানিপুলেট করতে পারে সংজ্ঞায়িত API এর বাইরে।

  • লকগুলি কেবল তখনই অনুলিপি করা হয় যখন অনুলিপিগুলি কার্যকর করা হয়, যখন অনুলিপিগুলি তৈরি করা হয় তালাগুলি প্রকাশিত হয়, একটি বুদ্ধিমান ক্রমে।

এর অর্থ:

  • যখন কোনও লিখন ঘটে তখন কেবল একটি পঠন এবং রাইটিং লকই থাকে না, তবে অতিরিক্ত অ্যাক্সেস লক থাকে। টেবিলটি নিজেই লক হয়ে আছে, অন্য প্রসঙ্গ এটি লক করতে, পড়তে, লিখতে বা প্রভাবিত করতে পারে এমন কোনও সম্ভাব্য উপায় নেই।

  • যখন কোনও পঠন ঘটে তখন কেবল পঠিত লকটি রাখা হয় না, তবে অতিরিক্ত অ্যাক্সেস লকটিও আবার টেবিলটি লক হয়ে যায়।

কোনও দুটি বিষয় বস্তু স্টোর থেকে শারীরিকভাবে বা একযোগে একই ডেটা অ্যাক্সেস করতে পারে না, তবে যে কোনও প্রসঙ্গে রেফারেন্স দিয়ে তৈরি লেখাগুলি কোনও রেফারেন্সের সাথে কোনও প্রসঙ্গে পড়া ডেটা প্রভাবিত করবে।

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

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

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

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

মাল্টি-থ্রেডিং কোনও নতুন ডাটাবেস ব্যবহার করার মতো নয়, ম্যানুয়ালটিতে প্রতিটি শব্দ এবং pthreads সহ পাঠানো উদাহরণগুলিতে ঘনিষ্ঠ মনোযোগ দেওয়া উচিত।

শেষ পর্যন্ত, পিএইচপি ম্যানুয়াল থেকে:

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


14
নির্বুধের মত উচ্চারণ.
জো ওয়াটকিন্স

7
@GeoC। আমি এখানেও নিশ্চিত নই যে আপনার বক্তব্যটি এখানে কী, এটি কেবল গীব্র একটি বোঝা এবং আপনি কোনও যুক্তি , যৌক্তিক বা অন্য কোনও কারণ সরবরাহ করেন না কেন আপনি কোনও যুক্তি (যে পোস্টে আমি সত্যিই দেখতে পাচ্ছি না) সাথে একমত নন কেন? ।
জিম্বো

13
@ টিউডর আমি মনে করি না আপনি সত্যিই জানেন যে আপনি কী বলছেন, তাই আমি আপনাকে উপেক্ষা করে খুশি।
জো ওয়াটকিন্স

4
@ টিউডার - অনেক বিজ্ঞানী তাদের শাখায় নতুন কিছু, বা দরকারী কিছু "বিন্দুটি দেখতে পান নি"। ইতিহাস দেখিয়েছে যে প্রায়শই না, নিজের মতো লোকেরা কেবল ভুল হয়, এটি একটি সত্য। ঠিক এটির মতো একটি সত্য যে আপনি এখানে যা লিখেছিলেন তা হ'ল একটি ভাল শব্দের অভাবে, মল। আমি দৃ positive়ভাবে সব কিছু ইতিবাচক মনে রেখে পরামর্শ দিচ্ছি, যে বিষয়গুলিতে আপনি কিছুই জানেন না সে বিষয়ে অংশ নেবেন না (এটি হ'ল একটি)।
এনবি

12
মজার ব্যাপার. জো ওয়াটকিন্স পাথ্রেডসের লেখক এবং এখনও টিউডর তাকে ভুল প্রমাণ করার চেষ্টা করেন।
হিস্টো ভালকানভ

48

এখানে উইলকো যা প্রস্তাব করেছিলেন তার একটি উদাহরণ:

$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!';
$pid = shell_exec($cmd);

মূলত এটি কমান্ড লাইনে পিএইচপি স্ক্রিপ্ট কার্যকর করে, তবে সঙ্গে সঙ্গে পিআইডি ফিরিয়ে দেয় এবং তারপরে পটভূমিতে চলে। (প্রতিধ্বনি ures! পিআইডি ব্যতীত অন্য কোনও কিছু ফেরত না তা নিশ্চিত করে)) এটি আপনার পিএইচপি স্ক্রিপ্টটি চালিয়ে যেতে বা আপনি চাইলে প্রস্থান করতে পারবেন। আমি এটি ব্যবহার করার পরে, আমি ব্যবহারকারীকে অন্য পৃষ্ঠায় পুনঃনির্দেশিত করেছি, যেখানে প্রতি 5 থেকে 60 সেকেন্ডে প্রতিবেদনটি এখনও চলছে কিনা তা পরীক্ষা করার জন্য একটি এজেএক্স কল করা হয়। (জিন_আইডি এবং এর সাথে সম্পর্কিত ব্যবহারকারীকে সংরক্ষণ করার জন্য আমার কাছে একটি টেবিল রয়েছে)) চেক স্ক্রিপ্টটি নিম্নলিখিতটি চালায়:

exec('ps ' . $pid , $processState);
if (count($processState) < 2) {
     // less than 2 rows in the ps, therefore report is complete
}

এই কৌশলটিতে এখানে একটি ছোট পোস্ট রয়েছে: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/


আমার কিছুটা সমস্যা আছে, আপনি কীভাবে পটভূমি প্রক্রিয়াটির স্থিতি পরীক্ষা করবেন? তুমি কি আমাকে জ্বালান করতে
slier

25

সংক্ষেপে: হ্যাঁ, পিএইচপিতে মাল্টিথ্রেডিং রয়েছে তবে পরিবর্তে আপনার মাল্টিপ্রসেসিং ব্যবহার করা উচিত।

ব্যাকগ্রাউড তথ্য: থ্রেড বনাম প্রক্রিয়া

থ্রেড এবং প্রক্রিয়াগুলির পার্থক্য সম্পর্কে সর্বদা কিছুটা বিভ্রান্তি থাকে, তাই আমি উভয়কেই শীঘ্রই বর্ণনা করব:

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

মাল্টিপ্রসেসিং

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

পিএইচপি-তে আপনার একটি নতুন প্রক্রিয়া তৈরির দুটি উপায় রয়েছে:

ওএসকে এটি আপনার জন্য করুন : আপনি আপনার অপারেশন সিস্টেমকে একটি নতুন প্রক্রিয়া তৈরি করতে এবং এতে একটি নতুন (বা একই) পিএইচপি স্ক্রিপ্ট চালাতে বলতে পারেন।

  • জন্য লিনাক্সের আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন বা ড্যারিল হেইনের উত্তর বিবেচনা করতে পারেন :

    $cmd = 'nice php script.php 2>&1 & echo $!';
    pclose(popen($cmd, 'r'));
  • জন্য উইন্ডোগুলির আপনি এটি ব্যবহার করতে পারেন:

    $cmd = 'start "processname" /MIN /belownormal cmd /c "script.php 2>&1"';
    pclose(popen($cmd, 'r'));

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

Multithreading

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

স্ট্যান্ডার্ড পিএইচপি কোনও মাল্টিথ্রেডিং সরবরাহ করে না তবে একটি (পরীক্ষামূলক) এক্সটেনশন রয়েছে যা আসলে করে - pthreads । এর এপিআই ডকুমেন্টেশন এমনকি এটি পিএইচপিএন.নে রূপান্তরিত করে । এটি দিয়ে আপনি যেমন পারেন তেমন কিছু করতে পারেন বাস্তব প্রোগ্রামিং ভাষায় :-) এটি:

class MyThread extends Thread {
    public function run(){
        //do something time consuming
    }
}

$t = new MyThread();
if($t->start()){
    while($t->isRunning()){
        echo ".";
        usleep(100);
    }
    $t->join();
}

জন্য লিনাক্স এখানে স্ট্যাকওভারফ্লোতে একটি ইনস্টলেশন গাইড রয়েছে

জন্য উইন্ডোজের এখন একটি রয়েছে:

  • প্রথমে আপনার পিএইচপি এর থ্রেড-নিরাপদ সংস্করণ প্রয়োজন।
  • আপনার উভয় পাইথ্রেড এবং এর পিএইচপি এক্সটেনশনের প্রাক-সংকলিত সংস্করণগুলি দরকার। সেগুলি ডাউনলোড করা যায় এখানে যায় । আপনার পিএইচপি সংস্করণের সাথে সামঞ্জস্যপূর্ণ সংস্করণটি ডাউনলোড করেছেন তা নিশ্চিত করুন।
  • আপনার পিএইচপি এক্সটেনশান ফোল্ডারে ([পিএইচপিডিরেক্টরি / এক্সট্রোল্ট) কপি করুন php_pthreads.dll (আপনি সবেমাত্র ডাউনলোড করেছেন জিপ থেকে)।
  • PthreadVC2.dll অনুলিপি করুন [phpDirectory] (মূল ফোল্ডার - এক্সটেনশন ফোল্ডার নয়)।
  • [PhpDirectory] / php.ini সম্পাদনা করুন এবং নিম্নলিখিত লাইনটি সন্নিবেশ করুন

    extension=php_pthreads.dll
  • উপরের স্ক্রিপ্টটির সাথে কিছুটা ঘুম বা ঠিক সেখানেই মন্তব্য রয়েছে যেখানে এটি পরীক্ষা করুন।

এবং এখন বড় বাট : যদিও এটি সত্যিই কাজ করে, পিএইচপি মূলত মাল্টিথ্রেডিংয়ের জন্য তৈরি করা হয়নি। পিএইচপি-র একটি থ্রেড-নিরাপদ সংস্করণ বিদ্যমান রয়েছে এবং v5.4 হিসাবে এটি প্রায় বাগ-মুক্ত বলে মনে হচ্ছে তবে বহু-থ্রেডযুক্ত পরিবেশে পিএইচপি ব্যবহার করা পিএইচপি ম্যানুয়ালটিতে এখনও নিরুৎসাহিত করা হয়েছে (তবে তারা কেবল তাদের ম্যানুয়ালটি আপডেট করেনি এটি, এখনও)। আরও বড় সমস্যা হতে পারে যে প্রচুর সাধারণ এক্সটেনশান থ্রেড-নিরাপদ নয় । সুতরাং আপনি এই পিএইচপি এক্সটেনশনের সাহায্যে থ্রেড পেতে পারেন তবে আপনি যে ফাংশনগুলির উপর নির্ভর করছেন সেগুলি এখনও থ্রেড-নিরাপদ নয় যাতে আপনি সম্ভবত বর্ণের পরিস্থিতি, ডেডলকস এবং এমন কি কোডের মুখোমুখি হবেন যে আপনি নিজের লেখেন নি ...


5
এটি মারাত্মকভাবে ভুল, আপনি যে নিবন্ধটি উল্লেখ করেছেন এটি ২০০৮ সাল থেকে। পিএইচপি মূলত থ্রেডটি নিরাপদ না থাকলে এটি SAPI মডিউলগুলি থ্রেড করে না।
জো ওয়াটকিন্স

1
@ জো: ঠিক আছে, আমি মূলভাবে এটি পরিবর্তন করেছি থ্রেড-নিরাপদ তবে প্রচুর এক্সটেনশন নেই।
ফ্রাঙ্কোইস বুর্জোয়া

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

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

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

17

থ্রেডের অনুরূপ কিছু অর্জন করতে আপনি pcntl_fork () ব্যবহার করতে পারেন । প্রযুক্তিগতভাবে এটি পৃথক প্রক্রিয়া, সুতরাং উভয়ের মধ্যে যোগাযোগ থ্রেডগুলির সাথে এতটা সহজ নয়, এবং আমি বিশ্বাস করি যে পিএইচপি যদি অ্যাপাচি দ্বারা ডাকা হয় তবে এটি কার্যকর হবে না।


4
আমি বেশ বড় ডেটা আমদানি টাস্কের সমান্তরালভাবে সফলভাবে pcntl_fork ব্যবহার করছি। দুর্দান্ত কাজ করে, এবং আমার প্রায় এক ঘন্টা এটি কাজ করে। এখানে কিছুটা শেখার বক্ররেখা রয়েছে, তবে একবার আপনি বুঝতে পারছেন কী চলছে, এটি বেশ সোজা forward
ফ্রাঙ্ক ফার্মার

ফ্র্যাঙ্ক, এটি কি সি এল এল পিএইচপি বা অ্যাপাচি পিএইচপি?
আর্টেম রাশাকোভস্কিই

@ আর্টেম: আমিও জানতে চাই
জোশ কে

5
@ ফ্র্যাঙ্ক ফার্মার আমাদের পিসিএল প্যাকেজের মতোই ... জ্বালাতন করছে।
রজার

1
আমি ccll_fork ব্যবহার করছিলাম CLI এর সাথে k আমি এপাচে কখনও চেষ্টা করে দেখিনি; এটা ঝুঁকিপূর্ণ মনে হচ্ছে। এমনকি সি এল এলিতেও কিছু অপ্রত্যাশিত সমস্যা ছিল were আমার মনে হয়েছে যে কোনও সমস্যা আছে যেখানে কোনও শিশু যদি একটি ডেটাবেস হ্যান্ডেল বন্ধ করে দেয় (কারণ এটি এর কাজ শেষ করে) তবে এটি ভাইবোনদের জন্যও সংযোগটি বন্ধ করে দেয়। শিশুরা যেহেতু পিতামাতার অনুলিপি, তাই বিজোড়তার জন্য প্রস্তুত prepare আমি যেহেতু কেবলমাত্র এক্সিকিউট () এর মাধ্যমে সম্পূর্ণ পৃথক প্রক্রিয়াগুলি নতুনভাবে স্পেন করতে আমার কোডটিকে নতুনভাবে ডিজাইন করেছি - এটি সেভাবে পরিষ্কার।
ফ্রাঙ্ক ফার্মার

13

যদি কেউ চিন্তা করে তবে আমি পিএইচপি_থ্রেডিং পুনরুদ্ধার করেছি (থ্রেডের মতো নয়, তবে একই) এবং আমার কাছে আসলে এটি এমন পর্যায়ে পৌঁছেছে যেখানে এটি কিছুটা ভালভাবে কাজ করে!

প্রকল্প পৃষ্ঠা

ডাউনলোড করুন (উইন্ডোজ পিএইচপি 5.3 ভিসি 9 টিএসের জন্য)

উদাহরণ

README


7

pcntl_fork()আপনি যা অনুসন্ধান করছেন তা কিন্তু এর প্রক্রিয়াটি থ্রেডিং না করে কাঁটাচামচ করে। সুতরাং আপনার কাছে ডেটা এক্সচেঞ্জের সমস্যা হবে। তাদের সমাধানের জন্য আপনি পিএইচপিএস সেম্যাফোর ফাংশনগুলি ব্যবহার করতে পারেন ( http://www.php.net/manual/de/ref.sem.php ) বার্তাগুলির সারি ভাগ করা মেমরি বিভাগের চেয়ে কিছুটা সহজ হতে পারে।

যাইহোক, একটি কৌশল যা আমি একটি ওয়েব ফ্রেমওয়ার্কে ব্যবহার করছি যা আমি বিকাশ করছি যা কোনও ওয়েব পৃষ্ঠার রিসোর্স নিবিড় ব্লকগুলি লোড করে (সম্ভবত বাহ্যিক অনুরোধের সাথে) সমান্তরাল: আমি কোন ডেটার জন্য অপেক্ষা করছি তা জানতে আমি একটি কাজের সারি করছি এবং তারপরে আমি কাঁটাচামচ করছি প্রতিটি প্রক্রিয়া জন্য কাজ বন্ধ। একবার হয়ে গেলে তারা এপিসি ক্যাশে তাদের ডেটা সঞ্চয় করে অনন্য কী দ্বারা পিতামাতার প্রক্রিয়াটি অ্যাক্সেস করতে পারে। প্রতিটি তথ্য সেখানে উপস্থিত থাকলে এটি অবিরত থাকে। আমি সাধারণ ব্যবহার করছিusleep() অপেক্ষা করার জন্য কারণ আন্তঃ প্রক্রিয়া যোগাযোগ অ্যাপাচে সম্ভব নয় (বাচ্চারা তাদের পিতামাতার সাথে সংযোগটি আলগা করে জম্বি হয়ে যাবে ...)। সুতরাং এটি আমাকে সর্বশেষে নিয়ে আসে: প্রতিটি শিশুকে আত্মহত্যা করা এটি গুরুত্বপূর্ণ! পাশাপাশি ক্লাস রয়েছে যেগুলি কাঁটাচামচ প্রক্রিয়া করে তবে ডেটা রাখে, আমি সেগুলি পরীক্ষা করিনি তবে জেন্ডার কাঠামোর একটি রয়েছে এবং তারা সাধারণত ধীর কিন্তু নির্ভরযোগ্য কোড করে। আপনি এখানে পেতে পারেন: http://zendframework.com/manual/1.9/en/zendx.console.process.unix.overview.html আমার মনে হয় তারা shm বিভাগগুলি ব্যবহার করে! ভাল শেষ তবে অন্তত এই জেন্ড ওয়েবসাইটটিতে একটি ত্রুটি আছে, উদাহরণে ছোটখাটো ভুল।

while ($process1->isRunning() && $process2->isRunning()) {
    sleep(1);
}
should of course be:
while ($process1->isRunning() || $process2->isRunning()) {
    sleep(1);
}

6

পি থ্রেডসের উপর ভিত্তি করে একটি থ্রেডিং এক্সটেনশন তৈরি করা হচ্ছে যা https://github.com/krakjoe/pthreads এ খুব আশাব্যঞ্জক দেখায়


6

কেবলমাত্র একটি আপডেট, দেখে মনে হচ্ছে পিএইচপি ছেলেরা থ্রেড সমর্থন করার জন্য কাজ করছে এবং এটি এখন উপলব্ধ।

এটির লিংকটি এখানে: http://php.net/manual/en/book.pthreads.php


5

আমার একটি পিএইচপি থ্রেডিং ক্লাস রয়েছে যা এখন দু'বছর ধরে একটি উত্পাদন পরিবেশে নির্বিঘ্নে চলছে।

সম্পাদনা: এটি এখন সুরকার গ্রন্থাগার হিসাবে এবং আমার এমভিসি কাঠামোর অংশ হিসাবে হাজার এমভিসি হিসাবে উপলভ্য।

দেখুন: https://git.hazaarlabs.com/hazaar/hazaar- থ্রেড


কী, যদি আপনার উদাহরণ অনুসরণ করে ফাইল.এফপি প্রোগ্রামটি উদাহরণস্বরূপ বলতে দেয়, এটি 10 ​​কে ওয়েবসাইটের ইউরিসের তালিকার অস্তিত্বকে খুব সুন্দর করে এবং তারপরে ফলাফলটি কোনও সিএসভি ফাইলে সংরক্ষণ করতে হয় ... এই ফাইলটি রাইটিংটি কি একটি হবে? সমস্যা?
রজার

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

1
পুনরায় নকশার কারণে লিঙ্কটি এখন মারা গেছে, আপনি এখানে ওয়েবব্যাক মেশিনে এটি পেতে পারেন: web.archive.org/web/20130922043615/http://dev.funkynerd.com/…
টনি

আমার এমভিসি ফ্রেমওয়ার্কটিতে এখন যুক্ত হয়েছে। দেখুন: git.hazaarlabs.com/hazaar/hazaar-thread
জেমি কার্ল

2

আমি জানি এটি একটি উপায় পুরানো প্রশ্ন, তবে আপনি http://phpthreadlib.sourceforge.net/ এ দেখতে পারেন

দ্বি-দিকনির্দেশক যোগাযোগ, Win32 এর জন্য সমর্থন, এবং কোনও এক্সটেনশানের প্রয়োজন নেই।


1

appserverটেকডিভিশন থেকে কখনও শুনেছেন ?

এটি পিএইচপিতে লিখিত এবং উচ্চ ট্র্যাফিক পিএইচপি অ্যাপ্লিকেশনগুলির জন্য মাল্টিথ্রেডগুলি পরিচালনা করার জন্য একটি অ্যাপসভার হিসাবে কাজ করে। এখনও বিটাতে রয়েছে তবে খুব ছড়িয়ে পড়েছে।


-3

বরং অস্পষ্ট, এবং শীঘ্রই হ্রাস করা হবে, বৈশিষ্ট্যযুক্ত টিকস । আমি কেবল এটির জন্য ব্যবহার করেছি, হ'ল কোনও স্ক্রিপ্টকে সিকিল (সিটিআরএল + সি) ক্যাপচার করার অনুমতি দেয় এবং মনোযোগ দিয়ে বন্ধ করে দেয়।


3
টিক্স সমান্তরালে চালিত হয় না। মূলত, প্রতিটি বিবৃতি দেওয়ার পরে, আপনার টিক ফাংশনটি চলে। আপনার টিক ফাংশনটি চলাকালীন মূল কোডটি চলমান নেই।
ফ্রাঙ্ক ফার্মার

1
টিক্স কেবল সংকেত () হ্যান্ডলারের জন্য প্রয়োজন।
নিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.