PDA

View Full Version : خبر: PHP هم Multi-Thread شد!



MMSHFE
یک شنبه 05 خرداد 1392, 14:37 عصر
امروز یکی از همکارهام (http://barnamenevis.org/member.php?268180-mpa360) توی شرکت کلاسی رو معرفی کرد که کلی منو سر ذوق آورد:
PThreads (http://pecl.php.net/package/pthreads)
توضیحات تکمیلی توی مستندات خودش هست. فقط همینقدر بگم که خیلی راحت میتونید چندین Process به زبان PHP رو اجرا و مدیریت کنید. امکاناتش هم خیلی زیاده و تمام ابزارهای استاندارد Java رو برای Thread داره.

MRmoon
یک شنبه 05 خرداد 1392, 14:48 عصر
با سلام.

آقاي شهركي ميشه لطفا در مورد اين multi-thread يكم توضيح بديد؟

engmmrj
یک شنبه 05 خرداد 1392, 15:13 عصر
لطفا بیشتر توضیح دهید .

farazsahebdel
یک شنبه 05 خرداد 1392, 15:28 عصر
لطفا توضیح بیشتر ؟؟؟

MMSHFE
یک شنبه 05 خرداد 1392, 15:33 عصر
ببینید Multi-Thread رو اگه بخوایم خیلی ساده توضیح بدیم، میشه اجرای چند کار همزمان بدون اینکه منتظر تمام شدن هرکدوم باشیم، منتها به نحوی که مدیریت هرکدام از کارها رو هم داشته باشیم. مثلاً در زمان دلخواه یکی رو نگه داریم (نبندیم) و بقیه اجرا بشن و هروقت خواستیم دوباره ادامه بدیم یا کلاً قطع کنیم. در هر لحظه بدونیم چندتا پردازش باز داریم. بتونیم چندتا از پردازشها رو درصورت لزوم ادغام کنیم که بشن یک پردازش و کلی کارهای دیگه. برای درک بهتر، این مثال رو درنظر بگیرین:


1- کاربر یک فایل txt. حاوی آدرس فایلهایی که میخواد دانلود بشه رو آپلود میکنه. (توسط Main Process)
2- فایلها توی دیتابیس درج میشه و جلوی فیلد status اونها صفر درج میشه - به معنی پردازش نشده (باز هم توسط Main Process)
3- از روی فایل dl.php به تعداد 10 عدد Thread ایجاد میشه. (مجدداً توسط Main Process)
4- هرکدوم از نسخه های dl.php (که یک Thread جداگانه هستن) توسط یک حلقه while مدام دیتابیس دنبال لینکی میگرده هنوز پردازش نشده (status = 0)
5- اگه چنین لینکی وجود داشت، فیلد status رو 1 میکنه (یعنی شروع پردازش) و شروع به دانلود میکنه و وقتی دانلود تمام شد، فیلد status رو 2 میکنه (یعنی پردازش تمام شد)
6- اگه چنین لینکی وجود نداشت، از حلقه while بیرون میاد و اجرای فایل تمام میشه و با این کار، Thread هم به پایان میرسه.

خوب توی این سناریو عمل دانلود فایل با چه سرعتی انجام شد؟ بله: 10 فایل همزمان. کاری که بدون Thread نمیشد.
البته این یک مثال خیلی خیلی ساده از کاربرد Thread هست. خیلی کارهای دیگه هم میشه انجام داد. مثلاً در همون حالی که اسکریپت داره پردازش میشه تا صفحه Load بشه، یک کار دیگه هم انجام بشه. مثلاً کاربر روی صفحه Gallery کلیک کرده. اسکریپت ما هم باید عکسها رو بخونه و با کدهای HTML توی صفحه بیاره، هم اینکه اطلاعات آخرین زمان بازدید و... رو اصلاح کنه ولی نمیخوایم آپدیت اطلاعات منتظر بارگذاری و خوندن اطلاعات عکسها بشه و فوری انجام بشه. برای این کار میتونیم کار پردازش تصاویر رو توی یک Thread‌جداگانه انجام بدیم.

engmmrj
یک شنبه 05 خرداد 1392, 15:57 عصر
کلاس PThreads (http://pecl.php.net/package/pthreads) با C++ نوشته شده ؟

MMSHFE
یک شنبه 05 خرداد 1392, 16:16 عصر
قاعدتاً بله. شما به سورس کدش کاری ندارین. فقط مثل بقیه افزونه ها روی PHP نصب میشه و ازش استفاده میکنید.

eshpilen
یک شنبه 05 خرداد 1392, 21:16 عصر
کلاس PThreads (http://pecl.php.net/package/pthreads) با C++‎ نوشته شده ؟
به گمانم با زبان C است.
خود PHP هم با زبان سی نوشته شده.

یعنی میخوام بگم چیزهایی اینقدر گسترده و پیچیده و موفق و مفید رو با یکی از قدیمی ترین زبانهای میانی نوشتن که حتی شیء گرایی هم نداره.

morteza_naderloo
دوشنبه 06 خرداد 1392, 00:35 صبح
یعنی میخوام بگم چیزهایی اینقدر گسترده و پیچیده و موفق و مفید رو با یکی از قدیمی ترین زبانهای میانی نوشتن که حتی شیء گرایی هم نداره.

استاد عزیز یعنی شما میفرمائید OOP چیزی خوبی نیست ؟! استفاده کردن یا نکردنش فرقی در بهبود کار نداره ؟! یا از C تعریف میکنید .

eshpilen
دوشنبه 06 خرداد 1392, 08:21 صبح
استاد عزیز یعنی شما میفرمائید OOP چیزی خوبی نیست ؟!استفاده کردن یا نکردنش فرقی در بهبود کار نداره ؟! یا از C تعریف میکنید .
نه منظورم اینه که در فواید و ضرورت OOP هم نباید اغراق و افراط کرد.
یا در اینکه برای نوشتن برنامه ها حتما باید از آخرین زبان سطح بالای روز استفاده بشه و زبانهای قدیمی تر دیگه استفادهء چندانی ندارن.

حتی با زبانهایی مثل سی که امکانات شیء گرایی ندارن هم میشه برنامه های بزرگ و پیچیده و موفقی نوشت؛ نمونه هاش PHP، هستهء لینوکس، محیط دسکتاپ گنوم و خیلی از اپلیکیشن های گرافیکی و خیلی از برنامه های دیگر (بخصوص برنامه های سیستمی و سرویس دهنده).

البته یک دلیل اینکه برنامه های سیستمی با زبانهای مثل سی و سی++ نوشته میشن پرفورمنسه.
از طرف دیگر، ماهیتا هم اینطور برنامه ها به اینطور زبانها نزدیکتر هستن و سازگاری بیشتری دارن. یا طور دیگر بگیم که فواید و نیاز شیء گرایی درمورد اونا کمتره.

اکثرا افراد تفکر کلیشه ای و تقلیدوار و ظاهرپسند و سطحی ای دارن درمورد چیزهایی مثل شیء گرایی، زبانهای جدید سطح بالا، MVC.
و اکثرا قابلیت ها و واقعیت ها و کاربردهای زبانها و روشهای قدیمی تر رو خیلی دست کم میگیرن.

مثلا اگر یک زبانی شیء گرایی نداره، یک زبانی مثل سی، به این معنی نیست که کد شما در این زبان نمیتونه هیچ نظم و سازماندهی و خوانایی ای داشته باشه و مدام مجبورید اسپاگتی کد بنویسید و حجم زیادی از کد و مدام کدها رو جاهای مختلف تکرار کنید.
یک نفر قبلا اینطور ادعا کرده بود!!

خیر، از قدیم الایام و حتی زمانی که شیء گرایی ای وجود نداشت روشهای مختلفی برای نظم و خوانایی و جلوگیری از تکرار و خیلی مسائل دیگه در همون زبانهای قدیمی مثل سی هم شناخته شده بودن و استفاده میشدن. کارایی این روشها به شیء گرایی نمیرسه، ولی اونقدری هم کم و ناکارا نیستن به اون شکلی که بعضی ها فکر یا ادعا میکنن. به گمانم اینطور افراد اصولا در این مورد اطلاعات و تجربه ای ندارن که اینطور فکر/ادعا میکنن.

البته حتی شیء گرایی رو هم میشه تاحدی در زبان سی هم شبیه سازی کرد. یک کتابخانه ای هست بنام GObject که همین کار رو انجام میده.

ضمنا فکر میکنم الان نسل جدید برنامه نویسانی که فقط یا عمدتا زبانها و برنامه نویسی سطح بالا رو یاد میگیرن و کار میکنن، طبیعتا از اون برنامه نویسان قدیمی و کسانی که با زبانها و برنامه های سطح پایین کار کردن درکل ضعیف تر هستن از نظر دانش و توانایی برنامه نویسی، و این باعث میشه نتونن هر برنامه ای رو به درستی بنویسن و هر مشکلی رو حل کنن.
طبیعتا یک برنامه نویس حرفه ای سی خیلی بهتر میتونه همهء فرایندها و بخصوص مواردی زیربنایی و سطح پایین مثل ساختمان داده ها، پروتکل ها، انکدینگ ها، فرمتها، و حتی الگوریتم ها و غیره رو درک کنه، و این کمک میکنه تا در برنامه نویسی سطح بالاتر هم مشکلات خاص رو (که کم پیش نمیان) خیلی راحتتر و سریعتر حل کنه؛ درجایی که برنامه نویس امروزی که فقط دوتا زبان سطح بالا بلده و همهء کارها رو بصورت کلیشه ای با فریمورک و کتابخانه ها و امکانات سطح بالای زبان انجام میده شاید اصلا نتونه کاری بکنه.

همینطور درمورد MVC هم خیلی وقتا ممکنه اغراق بشه.
بعضیا همینطور حتی برنامه های موفق و مشهور و مفید رو زیر سوال میبرن.
مثلا وردپرس رو نکوهش میکنن که چرا از آخرین متدهای مهندسی نرم افزار و الگوی طراحی استفاده نکرده.
خب این حرفا شاید تاحدی درست باشه، اما باید نگاه کرد که بالاخره اون برنامه چقدر موفق و مفید بوده. آیا به اهداف خودش رسیده یا نه. هدف نهایی بهرحال چیزی نیست جز اینکه برنامه ای بوجود بیاد که هدف مورد نظر رو برآورده کنه، حالا چه شیء گرا چه غیر شیء گرا چه با سی چه با سی شارپ چه بصورت MVC و چه غیر از اون.
اتفاقا اینکه یه برنامه ای مثل وردپرس موفق بوده باید ما رو به این نتیجه گیری برسونه که رعایت این متدها همیشه و درمورد هر برنامه ای ضروری یا حتی مفید نیست؛ یا حداقل نه اونقدری که فکر کنیم حتما از اول باید با اون روش خاص کار کنیم و اگر خلافش عمل کنیم اشتباه کردیم و جرمی مرتکب شدیم.

من میگم اینقدر ظاهربین و سطحی نباشیم و جوگیر نشیم و کورکورانه تقلید نکنیم.
این همه که درمورد این مسائل بحث میشه، درمورد مسائلی که بیشتر برنامه نویسها توش ضعف دارن بحث و تاکید نمیشه. میبینی انبوه افراد همیشه مقدار زیادی درمورد OOP و MVC صحبت میکنن، اما هنوز توی مسائل پایه ای که برنامه نویس باید بلد باشه مشکلات جدی دارن. مثلا در الگوریتم، ساختمان داده، پروتکل ها، استانداردها، زبان انگلیسی!!، رگولار اکسپرشن، و خلاصه یه چیزهای اولیه و پایه ای.
بنظر میرسه بدون OOP و MVC هم میشه برنامهء مفید و موفق نوشت، حتی برنامه های بزرگ و پیچیده، ولی بدون اون یکی دیگه ها نمیشه.
اما چرا پس رفتار و گفتار افراد تاحد زیادی برعکسه؟

درکل بنده با OOP و MVC مشکلی ندارم؛ چون خودم زیاد کار نکردم اصلا نظر کلی و قاطعی در این مورد ندارم. برای من اینها صرفا ابزارهایی هستن که هنوز مورد ضرورت و فواید بزرگ اونا برام پیش نیامده که استفاده کنم. شاید هم اصلا فرصت نکردم. کلا هم فکر نمیکنم درمقابل این همه مباحث و نیازهایی که برنامه نویسی داره، اینا چیز آنچنان حجیم و پیچیده ای باشن. بنظر بنده OOP و الگوهای طراحی کسر کوچکی بیش نیستن درمقابل دانش و مهارت و توانایی هایی که یک برنامه نویس توانمند باید داشته باشه.
اونایی هم که خیلی روی جزییات اینا چک و چونه میزنن قاعدتا باید افراد واقعا حرفه ای و دارای تجربه گسترده و نیازهای واقعی باشن، نه کسی که هنوز نمیتونه رگولار اکسپرشن بنویسه.

eshpilen
دوشنبه 06 خرداد 1392, 08:34 صبح
امروز یکی از همکارهام (http://barnamenevis.org/member.php?268180-mpa360) توی شرکت کلاسی رو معرفی کرد که کلی منو سر ذوق آورد:
PThreads (http://pecl.php.net/package/pthreads)

PThreads که به سیستم عاملهای یونیکسی مربوط میشه.
یعنی روی ویندوز نمیشه ازش استفاده کرد؟

MMSHFE
دوشنبه 06 خرداد 1392, 10:43 صبح
کجا گفته مربوط به Linux هست؟ توی Requirements چیزی ندیدم. بعلاوه فایلهاش DLL هست که مربوط به ویندوز میشه.

eshpilen
دوشنبه 06 خرداد 1392, 11:51 صبح
خب من دقیق این مورد خاص رو بررسی نکردم، اما میدونم که Pthreads (http://en.wikipedia.org/wiki/Pthreads) به معنای POSIX Threads است و POSIX که خودتون میدونید استاندارد سیستمهای خانوادهء یونیکسه.

البته الان مقالهء ویکیپدیا درمورد POSIX Threads رو نگاه کردم نوشته که برای ویندوز هم پیاده سازی ایجاد کردن:


DR-DOS (http://en.wikipedia.org/wiki/DR-DOS) and Microsoft Windows (http://en.wikipedia.org/wiki/Microsoft_Windows) implementations also exist: within the SFU/SUA (http://en.wikipedia.org/wiki/Windows_Services_for_UNIX) subsystem which provides a native implementation (http://en.wikipedia.org/w/index.php?title=Native_implementation&action=edit&redlink=1) of a number of POSIX APIs, and also within third-party (http://en.wikipedia.org/wiki/Third-party_developer) packages such as pthreads-w32,[1] (http://en.wikipedia.org/wiki/Pthreads#cite_note-1) which implements pthreads on top of existing Windows API (http://en.wikipedia.org/wiki/Windows_API)

بهزاد علی محمدزاده
دوشنبه 06 خرداد 1392, 12:11 عصر
سلام . بالاخره این ترد برای وب کاربرد داشت یا نداشت ؟ چون زمانی که از PHP دفاع می کنیم ، و وقتی که به ترد می رسیم ، میگیم که اصلا این موضوع کاربرد چندانی برای وب نداره !

همیشه تجربه های ما از کار با زبان ها و روشها ، در قضاوت ها مون تاثیر خواهد گذاشت .

شی گرایی هم همینطوره ، اگر از ابتدا شی گرا کار کنیم ، تجزیه و تحلیل شی گرا یاد بگیریم ، مثل کارگردانی تئاتر نقش تعریف کنیم ، برای نقش ها سناریو بنویسیم ، نمودار های توالی و فعالیت رسم کنیم ، بعد بیان یه زبان غیر شی گرا رو بهمون بدن باهاش کار کنیم و قرار باشه این متد ها رو هم انجام ندیم ، اونوقت خیلی خوب تفاوت ها رو درک می کنیم .

به هر حال ممنون .

MMSHFE
دوشنبه 06 خرداد 1392, 12:55 عصر
در کاربردهای عادی (شاید بشه بگیم بیش از 90٪ موارد) کاربردی نداره ولی در برخی موارد کاربرد خیلی خوبی پیدا میکنه. مثل همون نمونه ای که گفتم. درهرحال الآن دیگه PHP هم از Multi-Thread پشتیبانی میکنه و NET. کارها نمیتونن بعنوان نقطه ضعف برای PHP مطرحش کنن.

eshpilen
دوشنبه 06 خرداد 1392, 12:58 عصر
درهرحال الآن دیگه PHP هم از Multi-Thread پشتیبانی میکنه و NET. کارها نمیتونن بعنوان نقطه ضعف برای PHP مطرحش کنن.
الان؟
یعنی الان میتونید به همین راحتی روی هاست اشتراکی خودتون PHP با پشتیبانی مالتی ترد داشته باشید؟

MMSHFE
دوشنبه 06 خرداد 1392, 13:00 عصر
بله همین الآن دقیقاً داریم از این تکنیک استفاده میکنیم. منتها بخاطر یکسری مسائل امنیتی (پروژه های محرمانه و داخلی شرکت) نمیتونم لینکش رو بدم.

engmmrj
دوشنبه 06 خرداد 1392, 13:40 عصر
نحوه کد نویسی به چه صورت است ؟

MMSHFE
دوشنبه 06 خرداد 1392, 13:52 عصر
توی لینک Document که گذاشتم توضیحش هست. کار زیاد پیچیده ای نیست.

Veteran
دوشنبه 06 خرداد 1392, 18:19 عصر
امروز یکی از همکارهام (http://barnamenevis.org/member.php?268180-mpa360) توی شرکت کلاسی رو معرفی کرد که کلی منو سر ذوق آورد:
PThreads (http://pecl.php.net/package/pthreads)
توضیحات تکمیلی توی مستندات خودش هست. فقط همینقدر بگم که خیلی راحت میتونید چندین Process به زبان PHP رو اجرا و مدیریت کنید. امکاناتش هم خیلی زیاده و تمام ابزارهای استاندارد Java رو برای Thread داره.

مین الآن یک پروژه شروع کردم که خیلی نمیتونم وارد جزئیاتش بشم (فعلاً) ولی همینقدر بگم که کاری هست که تابحال توی دنیا شاید مشابهش انجام نشده. خیلی خلاصه بخوام بگم، یک Download Manager با PHP هست با قابلیت Resume و Pause و... و بصورت Multi-Thread (اینو قابل توجه eshpilen گفتم: بله با یکسری ترفندها بالأخره PHP رو هم Multi-Thread کردیم!).
این همونه ؟

MMSHFE
دوشنبه 06 خرداد 1392, 19:13 عصر
نه این اون نیست. این ویژگی اخیراً اضافه شده و برخی از امکاناتی که ما درست کردیم رو نداره ولی کار راه اندازه.