چطور یک موتور جستجو بسازیم؟

مفاهیم موتور جستجو و آموزش ساخت موتور جستجو با PHPموتور های جستجو چه هستند و چگونه کار میکنندموتورهای جستجوگر امروزه بخش جدا ناپذیر از اینترنت هستند . در این مقاله میخواهیم موتورهای جستجوگر و مفاهیم آنرا بصورت کامل پوشش دهیم .موتور های جستجوگر به ابزار بسیار کاربردی در زمینه اینترنت تبدیل شده اند و این ابزارها برای برنامه نویسان ، توسعه دهندگان ، مدیر شرکت ها ، کسب و کارهای آنلاین و دیگر کاربران اینترنتی بسیار کمک کننده و مفید هستند .با استفاده از موتور جستجوگر ما میتوانیم اطلاعاتی درباره ی موضوع خاص را به راحتی بدست بیاوریم .ما در این مقاله قصد داریم علاوه بر بررسی تخصصی موتور جستجوگر و مفاهیم آن ، به شما آموزش بدیم چطور موتور جستجوی شخصی خودتان را با PHP و MySQL بسازید ! تعجب نکنید شما هم میتوانید گوگل اولش انقدر قدرتمند نبود طی سالهای درازی اینطوری شده و تبدیل شده به یک سیستم عالی !‌ولی شما هم میتوانید از یه سیستم ساده ی موتور جستجو شروع کنید و آنرا هر روز بهتر از دیروز بکنید .البته در این مقاله ما قصد نداریم چیزی به شما یاد بدهیم که جایگزینی برای گوگل یا یاهو بسازید چون طبیعتا این امر فعلا امکان پذیر نیست ولی شما با این آموزش به مفاهیم موتورهای جستجو و طرز عمل آنها مسلط میشوید و یاد میگیرید چطور با PHP یک موتور جستجو بسازید .موتور جستجو چیست ؟بصورت کلی موتور جستجو یک ابزاری در بستر اینترنت است که به کاربران کمک میکند اطلاعات مختلف را از بین میلیون ها سایت به راحتی پیدا کنند . موتور جستجوهای پرکاربرد در جهان عبارتند از Google, Yahoo!, MSN, Bing , Ask و غیره ...موتورهای جستجو مثل یک برنامه ی کامپیوتری هستند که در بین اسناد زیادی که دارید بین یک کلمه ی خاصی میگردند و آن اسناد را برای شما طبقه بندی میکنند .به هر حال بصورت عامیانه موتور جستجو چیزی است مثل Google , Bing , Yahoo و غیره ...موتورهای جستجوگر ابزار خودکاری مثل ربات ها و خزنده ها را دارند که به سرتاسر اینترنت میفرستند و آنها وقتی به یک سایتی وارد میشوند تمام آن سایت را تحلیل و بررسی میکنند بعد از جمع آوری اطلاعات وارد لینک های آنها میشوند و بعد از ورود به صفحه ی دیگر یا سایت دیگر دوباره آنرا بررسی میکنند و بعد روی لینک های روی آن صفحه کلیک میکنند و دوباره به مقصد بعدی کوچ میکنند . همینطور کل اینترنت را گشته و اطلاعات را جمع آوری میکنند و به پایگاه های داده موتور انتقال میدهند .سپس این اطلاعات جمع بندی و طبقه بندی میشود ،‌ به این کار index کردن سایت ها میگویند . وقتی کاربر کلمه ی گرگ را جستجو میکند موتور جستجو در پایگاه داده خود میگردد و بین سایت هایی که این کلمه را ربات ها و خزنده ها جمع آوری کرده اند براساس رتبه ی آنها لیست میکند و به کاربر نمایش میدهد .موتور های جستجو چطور کار میکنند ؟‌هر موتور جستجو یک الگوریتمی برای لیست کردن و نمایش اطلاعات طبقه بندی شده از سایت ها دارد.نتیجه ی جستجو در موتور های جستجو گر در یک لیستی به نام SERP که مخفف Search Engine Results Page است نمایش داده میشود .معمولا الگوریتم موتور های جستجوگر به دنبال کلمات کلیدی در بخش های مختلف سایت میگردد و آنها را مهم میداند مثلا عبارت هایی که در title صفحه یا درون محتوای یک صفحه یا کلمات کلیدی آن وجود دارد .سپس وب سایت ها در موتور جستجو Rank بندی یا رتبه بندی میشود که کدام سایت اول نمایش داده شود و سپس کدام سایت ها یعنی به ترتیب کیفیت و محتوای سایت ها بیشتر توجه میشود و الگوریتم های موجود در موتورهای جستجوگر تقریبا همگی به کیفیت بالا اهمیت میدهند چون هر سایتی که کیفیت بالاتری داشته باشد بهتر است ابتدا دیده شود .البته هر موتور جستجوگر الگوریتم خاص خودش را دارد مثلا یک وب سایتی ممکن است در گوگل در رتبه ی 1 باشد ولی در موتور جستجوی یاهو در رتبه ی 10 باشد و این بستگی دارد به الگوریتمی که پشت آن موتور است .الگوریتم های استفاده شده در موتور های جستجوگر تقریبا در حالت مخفی و سرّی و دائما هم در حال بروزرسانی و بهبود هستند بنابراین صاحبان وب سایت ها باید مرتبا روی سئو سایت خود کار کنند تا الگوریتم های جدید سایت ها را بهتر بشناسد .اگر راز الگوریتم موتور جستجو فاش شود شرکت ها سعی میکنند آنرا دور بزنند و با ایجاد رتبه ی جعلی به جاهای بالاتری بروند که این باعث میشود موتور جستجو نتایج خوبی بدست نیاورد . گاهی نحوه ی کار کردن الگوریتم ها کشف میشود و اینجاست که خیلی ها سعی میکنند تقلب کنند و دقیقا بعد از این اتفاق توسعه دهندگان آن موتور جستجو الگوریتم را بروزرسانی میکنند و یک برچسب spam به آن سایت های متقلب میزنند و رتبه ی آنها به شدت کاهش پیدا میکند .موتورهای جستجو گر به سورس یک وب سایت مراجعه میکنند یعنی چیزی که موتور جستجوگر از یک سایت میبینید با چیزی که یک انسان میبیند متفاوت است . موتور جستجو متن ها را میخواند و برایش تصاویر و انیمیشن ها بی مفهوم است .به همین علت هم بود که سریعا بساط سایت هایی که کلا با فلش طراحی میشدند جمع شد چون انیمیشن ها و گرافیک فلش برای موتور نامفهوم بود و رتبه ی سایت هایی که با HTML و CSS ساخته شده بودند بسیار بهتر بود .در هر صورت اگر شیوه ای را اتخاذ کنیم که متن خالی توسط موتور ها قابل رویت نباشد به احتمال زیاد رتبه ای هم در موتور های جستجو نخواهیم داشت .موتورهای جستجوی وبدر متن بالا که درباره ی موتورهای جستجو صحبت میکردیم اشاره ی کوتاهی هم به موتور جستجوی وب داشتیم . همانطور که بالا هم گفتیم این موتور ها یک خزنده به سمت سایت شما ارسال میکنند و این توانایی را دارد که محتوای وب سایت شما را به همراه کلمات کلیدی یک صفحه واکشی کند . یک برنامه ی دیگری به نام indexer وجود دارد اسنادی که خرنده آورده است را میخواند و دسته بندی میکند و به آنها رتبه میدهد .هر موتور جستجوگری بر اساس الگوریتم خاص خود این رتبه بندی را انجام میدهد .از آنجایی که سازندگان وب سایت ها میدانند که قرار است خزنده های موتور جستجو گر های مختلف به سایت آنها مراجعه کند پس شروع میکنند به بهینه کردن وضعیت سایت خود و آماده کردن آن برای خزنده های موتور جستجو که به این کار SEO یا بهینه سازی موتورهای جستجوگر گفته میشود .ویژگی موتورهای جستجوموتورهای جستجو بدون نظارت انسان کار میکنند . هر شخصی میتواند از آنها استفاده کند و برخی از موتورهای جستجو نیز دارای نقص های درونی هستند .اما اگر کسی بخواهد موتورهای جستجو و الگوریتم واقعی آن را دور بزند ممکن است موتور جستجو آنرا بعنوان spam بشناسد .موتورهای جستجو دارای انواع اطلاعات بصورت یکجا میباشد مانند : شماره تلفن ها ، جزوات و مقالات اموزشی ،‌ ویدیوها ، موسیقی ، روزنامه ها ، وضعیت آب و هوا و خیلی اطلاعات دیگر ...موتورهای جستجو این قابلیت را دارند که انواع نیاز های کاربران را فراهم کنند .نکاتی که هنگام استفاده از موتور جستجوها باید رعایت کنیدما بعنوان یک جستجوگر باید یاد بگیریم که چطور عبارت دلخواهمان را به موتور جستجو بگوییم تا بهترین نتیجه را برای ما بیاورد .اپراتورهای جستجو به دو دسته ی اصلی تقسیم بندی میشوند :‌اپراتورهای Booleanاپراتورهای غیر Booleanدر اینجا منظور ما از اپراتور یک کلمه یا یک سمبلی است که تایپ میکنیم .اپراتور کلمه یا نمادی است که تایپ می کنیم. این راهنما را به موتور جستجو راهنمایی می کند تا بداند چه چیزی را جستجو کند. با استفاده از این اپراتورها می توانیم جستجوی خود را محدود یا گسترده تر کنیم ، بنابراین به ما کمک می کنیم تا وب سایت هایی را که برای شما مفید است پیدا کنیم.اپراتورهای هر موتور جستجوگر ویژه ی خودش میباشد و باید نسبت به موتوری که استفاده میکنید اپراتور های انها را یاد بگیرید .تکنیک های جستجوی Booleanعبارت AND :این عبارت به موتور جستجو گر میگوید یک عبارت یا عبارت دیگر اگر در محتوا بود به من نمایش بده . این راه کار باعث محدود شدن وب سایت ها و بهتره پیدا شدن نتیجه ی مورد نظر میشود مثلا اگر بخواهیم به موتور بگوییم گل و قرمز را برای ما پیدا کن یا گل و قرمز و آبی را پیدا کن باید رشته های زیر را جستجو کنیم :‌گل AND قرمزگل AND فرمز AND آبیعبارت OR :این عبارت به موتور جستجو میگوید هر چیزی که OR بین آنها قرار گرفت یکی از آنها را پیدا کن مثلا گل یا آسمان فرقی ندارد پس گل OR آسمان ممکن است در نتایج جستجو هم آسمان داشته باشد هم گل !این مورد باعث زیاد شدن نتایج جستجو و سخت تر شدن پیدا کردن هدف اصلی میشود ولی بازه ی جستجو را گسترده میکند که کاربرد های خاص خود را دارد .عبارت NOT :این عبارت باعث حذف شدن یک کلمه خاص از نتایج جستجو میشود مثلا اگر ما به دنبال گوشی موبایل هستیم ولی نمیخواهیم مدل LG را نمایش دهد به راحتی مینویسیم موبایل -ال جی . توجه کنید که این عبارت در دستورات جستجوی گوگل با علامت منفی یا - انجام میگیرد.تکنیک های جستجوی Non-Boolean در موتور های جستجوگرعبارت + :‌ این درست مثل AND عمل میکند یعنی اگر در بین دو یا چند عبارت قرار گیرد همه ی آنها باید در نتیجه ی جستجو باشند مثلا گل + أبی + قرمزعبارت - :‌این عبارت هم دقیقا مثل NOT عمل میکند که البته در مثال بالا در گوگل ما فقط توانستیم از - استفاده کنیم چون دستور گوگل همین است .عبارت "" :هر چیزی که بین " " قرار بگیرد به موتور جستجو میگوید عینا همین را جستجو بکن و جستجوی شما را خاص میکند .آموزش ساخت موتور جستجوی شخصی با Php و Mysqlشاید خیلی هیجان انگیز باشه که یه موتور جستجو بسازید هر چند ساده !‌ کلی مفاهیم یاد میگیرید و کلا دستتون میاد که موتور های جستجو چطور کار میکنند .ما قصد نداریم موتور جستجو گر حرفه ای بسازیم که در اندازه ی Yahoo یا Google باشه ما داریم تمرین میکنیم و حداقل یک موتور جستجو در حد موتور جستجوهای بومی که میتونیم بسازیم باهاش تفریح کنیم .پس شروع میکنیم و با استفاده از ابزارهای اوپن سورس مثل PHP و MySQL این کار را انجام میدیم .خب از آنجایی که ما در این آموزش از زبان برنامه نویسی PHP استفاده خواهیم کرد طبیعتا شما باید با مفاهیم این زبان برنامه نویسی آشنا باشید و اگر آشنا نیستید اشکالی ندارد ما قبلا یک دوره ی آموزشی برای این زبان برگزار کردیم که از لینک زیر میتوانید تهیه کنید .همچنین اگر قصد دارید در زبان PHP تسلط شما بیشتر شود ما دو دوره ی پیشرفته دیگری هم برگزار کردیم که مطمئنا باعث ارتقای دانش و تخصص PHP در شما میشود و در تمامی زمینه های ساخت وب سایت به درد شما میخوره .از لینک های زیر میتوانید این دوره های پیش رفته را ببینید و در صورت تمایل در انها شرکت کنید .همچنین به علت اینکه پایگاه داده مورد استفاده ی ما MySQL است بهتره کمی کار با این پایگاه داده و کوئری های sql آشنا باشید ( با یه سرچ ساده پیدا میکنید ) .خب با این فرضیات ما شروع میکنیم ابتدا یک فرم خالی HTML میسازیم که کاربران عبارت مورد جستجو را آنجا وارد کنند و سپس یک دکمه میزاریم برای جستجو که وقتی کلیک شد جستجو انجام بگیرد .آموزش ساخت بخش پایگاه داده موتور جستجوگر اینترنتیخب همانطور که بالا اشاره کردیم پایگاه داده ی ما MySQL است پس باید ابتدا این پایگاه داده را نصب و راه اندازی کنید اگر ویندوزی هستید بهتره یکی از برنامه های زیر را بگیرید که PHP و MySQL و دیگر مخلفات را داخل خودش دارن :‌XamppWamppEasyPHPتوجه کنید که یکی از موارد بالا را به انتخاب خودتان نصب و اجرا کنید و ما Xampp را پیشنهاد میکنیم .برای شروع یک پایگاه داده با هر اسمی که دوست دارید بسازید و سپس یک جدول درونش به نام SEARCH_ENGINE بسازید .کد sql زیر به شما کمک میکند یک جدول با نام SEARCH_ENGINE بسازید .CREATE TABLE SEARCH_ENGINE ( `id` INT(11) NOT NULL AUTO_INCREMENT, `pageurl` VARCHAR(255) NOT NULL, `pagecontent` TEXT NOT NULL, PRIMARY KEY (`id`))آموزش ساخت فرم برای موتور جستجوگر اینترنتیخب ، بعد از اینکه پایگاه داده آماده شد و جدول مورد نظر را ساختیم الان نوبت اینه که یک فرم HTML بسازیم که کاربران نهایی ما وقتی موتور جستجوگر ما را باز میکنند آنرا ببینند و بتوانند عبارت مورد نظر خود را تایپ کنند و دکمه ی جستجو را بزنند .در ریشه ی اصلی سرور مجازی که نصب کردید یه فایل جدید به نام index.php بسازید و محتویات زیر را درونش کپی کنید .<html> <head> <title> My search engine </title> </head> <body> < form action = 'search.php' method = 'GET' > < center > <h1 > My Search Engine </h1 > < input type = 'text' size='90' name = 'search' > </ br > </ br > < input type = 'submit' name = 'submit' value = 'Search source code' > < option > 10 </ option > < option > 20 </ option > < option > 50 </ option > </ center > </ form > </ body > </ html >فرم ما اکنون تکمیل شده و آماده استفاده است. این فرم توسط کاربران نهایی برای ورود به جستجوگر استفاده می شود و در عین حال به کاربران این امکان را می دهد که شماری از نتایج را که باید نشان داده شوند محدود کنند.آموزش نوشتن الگوریتم موتور جستجوگر اینترنتیبرای این کار ابتدا یک فایل دیگر PHP به نام search.php بسازید و در کنار همان index.php که بالا ساختیم قرار دهید . این فایل از بخش های زیر تشکیل خواهد شد .اتصال به پایگاه دادهاز کد زیر برای اتصال به پایگاه داده استفاده کنیدmysql_connect ( &quotlocalhost&quot, &quotUSER_NAME&quot, &quotPASSWORD&quot ) ; mysql_select_db ( &quotDB_NAME&quot );خب حالا که اتصال به پایگاه داده برقرار شد بهتره که کوئری مناسب با کلمه یا عبارت مورد جستجو توسط کاربر را بنویسیم .نوشتن کوئری متناسب با عبارت جستجو شدهکوئری مناسب برای این کار بصورت خیلی ساده طبق کدهای زیر است .$search_exploded = explode ( &quot &quot, $search ); $x = 0; foreach( $search_exploded as $search_each ) { $x++; $construct = &quot " if( $x == 1 ) $construct .= &quotkeywords LIKE '%$search_each%' " else $construct .= &quotAND keywords LIKE '%$search_each%' " } $construct = &quot SELECT * FROM SEARCH_ENGINE WHERE $construct " $run = mysql_query( $construct );کار بعدی ما واکشی اطلاعات از پایگاه داده و نمایش آن به کاربر است . اگر جستجو نتیجه ای دربرنداشت هم باید پیامی به کاربر ارسال کنیم .واکشی نتیجه از پایگاه داده و قرار دادن نتیجه در اختیار کاربر . طبق کدهای زیر باید انجام بگیرد .if ($foundnum == 0) echo &quotSorry, there are no matching result for <b> $search </b>. </ br > </ br > 1. Try more general words. for example: If you want to search 'how to create a website' then use general keyword like 'create' 'website' </ br > 2. Try different words with similar meaning </ br > 3. Please check your spelling" else { echo &quot$foundnum results found !<p>" while ( $runrows = mysql_fetch_assoc($run) ) { $title = $runrows ['title']; $desc = $runrows ['description']; $url = $runrows ['url']; echo &quot<a href='$url'> <b> $title </b> </a> <br> $desc <br> <a href='$url'> $url </a> <p>" } }اکنون موتور جستجوی ساده ی ما آماده است . در زیر کد کامل search.php را میبینید .<?php $button = $_GET[ 'submit' ]; $search = $_GET[ 'search' ]; if( !$button ) echo &quotyou didn't submit a keyword" else { if( strlen( $search ) <= 1 ) echo &quotSearch term too short" else { echo &quotYou searched for <b> $search </b> <hr size='1' > </ br > " mysql_connect( &quotlocalhost&quot,&quotUSERNAME&quot,&quotPASSWORD&quot) ; mysql_select_db(&quotDBNAME&quot); $search_exploded = explode ( &quot &quot, $search ); $x = 0; foreach( $search_exploded as $search_each ) { $x++; $construct = &quot" if( $x == 1 ) $construct .=&quotkeywords LIKE '%$search_each%'" else $construct .=&quotAND keywords LIKE '%$search_each%'" } $construct = &quot SELECT * FROM SEARCH_ENGINE WHERE $construct " $run = mysql_query( $construct ); $foundnum = mysql_num_rows($run); if ($foundnum == 0) echo &quotSorry, there are no matching result for <b> $search </b>. </br> </br> 1. Try more general words. for example: If you want to search 'how to create a website' then use general keyword like 'create' 'website' </br> 2. Try different words with similar meaning </br> 3. Please check your spelling" else { echo &quot$foundnum results found !<p>" while( $runrows = mysql_fetch_assoc( $run ) ) { $title = $runrows ['title']; $desc = $runrows ['description']; $url = $runrows ['url']; echo &quot<a href='$url'> <b> $title </b> </a> <br> $desc <br> <a href='$url'> $url </a> <p>" } } } } ?>ساختار موتور جستجوگر اینترنتی پیشرفته ترموتور های جستجوگر معمولا پیشرفته تر هستند یعنی شامل بخش ها و کدهای زیادی هستند که برای مثال یک عبارت خاص را از بین میلیون ها اسناد واکشی میکنند و نتایج را دسته بندی و مرتب سازی کرده و به کاربر نهایی نمایش میدهند .حالا این وسط ممکن است کاربر نهایی یکی از عبارت ها را اشتباه تایپ کرده باشد ولی موتور جستجوگر شما باید قادر باشد آنرا بفهمدیا مثلا کاربر کلمه ی دقیق یک چیزی را به یاد نمی آورد و با اشاره به کلمات مشابه آن میخواهد آنرا پیدا کند گوگل این قابلیت را دارد که به این شخص در پیدا کردن گمشده ی خود کمک کندپس موتور های جستجوگر بزرگ در اینترنت بسیار گسترده تر از حوصله ای این آموزش و گنجایش اینجاست . ما قصد داریم اساس و پایه را یاد بگیرید سپس میتوانید آنرا گسترش دهید و حداقل یک موتور جستجو متوسط برای ایران بسازید که بومی باشد و به درد بخور !!!بخش های اصلی یک موتور جستجوی اینترنتییک خزنده که اصطلاحا به آن crawler گفته میشود که وظیفه اش واکشی اطلاعات مربوط به سایت ها و اسناد و کلا جمع آوری هر آنچه در اینترنت است .یک بخش index برای نگهداری صفحات یا اسناد ذخیره شده که بصورت ساختاری در آنجا قرار گرفته اندو یک مخزن اسناد برای نگهداری اطلاعات مربوط به کل اسناد موجودخزنده یا crawler موتور های جستجو چطور کار میکنندهمانگونه که بالا هم گفتیم خزنده ها یا crawler ها در سرتاسر اینترنت میچرخند و اطلاعات سایت ها را جمع آوری میکنند اما خزنده ها باید لیستی از URL های اینترنتی داشته باشند که به آنها رجوع کنند . برای این کار چند روش کلی وجود دارد که در زیر به آنها پرداخته ایم .متداول ترین روش این است که URL ها را بعنوان یک لیست و feed به خزنده بدهیم . سپس خزنده یک به یک به آنها رفته و عمل crawle را انجام دهد .روش دیگر دانلود کردن لیستی از URL ها و استفاده از آنهاست .ابتدا یک تجزیه کننده ی لینک ها مینویسیم تا لینک های واقعی را بشناسیم . کدهای زیر را ببینید .$file_handle = fopen( &quot Quantcast-Top-Million.txt &quot, &quotr&quot ); while ( !feof ( $file_handle ) ) { $line = fgets( $file_handle ); if( preg_match( '/^\d+/',$line ) ) { # if it starts with some amount of digits $tmp = explode( &quot\t&quot,$line ); $rank = trim( $tmp[0] ); $url = trim( $tmp[1] ); if( $url != 'Hidden profile' ) { # Hidden profile appears sometimes just ignore then echo $ } } } fclose( $file_handle );سپس کد خزنده را برای دریافت محتوای یک URL مینویسیم که دانلود کردن دااده های سایت های در لیست ممکن است کمی زمان ببرد .$file_handle = fopen(&quoturllist.txt&quot, &quotr&quot); while (!feof($file_handle)) { $url = trim(fgets($file_handle)); $content = file_get_contents($url); $document = array($url,$content); $serialized = serialize($document); $fp = fopen('./documents/'.md5($url), 'w'); fwrite($fp, $serialized); fclose($fp); } fclose($file_handle);خزنده ی بالا یک خزنده ساده ی تک رشته ای است که داخل حلقه ای تمامی URL ها را واکشی میکند اطلاعات آنها را دریافت و در دیسک ذخیره سازی میکند .نکته ای که وجود دارد این است که URL به همراه محتوای آن هم در یک فایل ذخیره میکنیم و این URL به رتبه بندی لیست و همچنین برای اینکه متوجه شویم منبع این محتوا کجاست به درد میخورد .بخش INDEXاین بخش باید مسئولیت هایی را برعهده ی خود داشته باشد :‌نیاز است که محتویات را در دیسک ذخیره کند و آنها را واکشی کندوقتی میخواهیم همه چیز را دوباره تولید کنیم باید قادر باشد خودش را پاکسازی کندباید اسنادی که ذخیره میکند را اعتبار سنجی کندبا تعاریف بالا باید interface خود را به شکل زیر داشته باشیمinterface iindex { public function storeDocuments($name,array $documents); public function getDocuments($name); public function clearIndex(); public function validateDocument(array $document); }هر چند پیاده سازی یک موتور جستجو کار ساده ای نیست ولی ما سعی کردیم کلیت موضوع را در این مقاله برای شما آشکار کنیم . چیزی که شما نیاز دارید این است که الان بدون ترس وارد کدها شوید و تمرین و تست کنید برای هر بخشی کی راه کاری مطمئنا وجود دارد .به اتمام مقاله رسیدیم و منتظر نظرات و پیشنهادات شما برای تکمیل این مقاله هستیم.منبع: https://avasam.ir/post/144/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85%20%D9%85%D9%88%D8%AA%D9%88%D8%B1%20%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%20%D9%88%20%D8%A2%D9%85%D9%88%D8%B2%D8%B4%20%D8%B3%D8%A7%D8%AE%D8%AA%20%D9%85%D9%88%D8%AA%D9%88%D8%B1%20%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%20%D8%A8%D8%A7%20PHP