Does your Ajax requests take long time? it’s PHP session locking problem – updated

logo php sessionHello All,

That is the 9th\10th post in my challenge for 30 days of blogging and this post have been delayed because i was insisting on writing it in Arabic and its a technical post trying to document a technical solution for Ajax requests that take long time, That problem when i started on the blog post in Arabic i found difficulty in describing it and the solution with the right words so here it is in English.

The article require understanding of PHP Sessions and Ajax i will incloud definitions of them to make it easy for the ones who starting in PHP.

What is PHP session ?

Imagine you are developing a web application and want to recognize the user and remember who he is in all the pages without making him enter his details in every one, you may use Cookies or Session.

You get the point now Session is a way of storing users info and can recall it from any page, unlike Cookies Session stored on the server so user have no way of editing it.

By default session variables last until the user closes the browser or stay inactive for sometime defined in the server configurations, Whenever you want to recall or store user data in PHP page you must start the page with calling session_start() function so you know will have access on $_SESSION variable.

What is AJAX?

AJAX stands for Asynchronous JavaScript and XML. Is the way of sending and receiving data from a server without reloading the full page.

We use that method to send data and retrieve info from the server in faster way as we don’t want to receive the full page and render it in the browser as it will be much slower.

As result we can update part from the web page user on like what users see when they scroll down in facebook time line page as new content get added without refreshing the page.

The problem

We now -and it is not a new thing- develop applications depend on Ajax up to %100 But when a web page sends two or more Ajax requests you find them take mush time and maybe finish almost in the same time.

The cause

When you send an Ajax request to a server and your PHP script starts with

session_start();

then that call and lock the PHP session file on the server and as you know PHP store sessions in files on server, so the same script can not edit the same session file on the server, and that is a classic lock file condition, so any other request will call PHP file that call session_start() will wait till the first request finish to start first in first out and now most if not all PHP frameworks use session_start() as first thing in the main file.

The solution

session_write_close();

Using session_write_close() function to write and close the session file on the server will release the session file so another request can use it and this script will continue working normally but you should know that you are not allow to store any thing in the session after using session_write_close(); in the same script but from the other request it will be ok.

Update:

I have created a test code to see the problem ad uploaded it on GitHub you can find it here ” PHP session locking problem with Ajax” you will need to add it under your local host and open the console to see the requests  and responses time.

As we see in the code in that file, for example if we made more than request the a page have that code

session_start();
sleep(5);

Each request will wait the previous one to finish which will take 5 sec, because the session file have not be released yet so the new connected will be blocked on the first like session_start() that will kill the idea if asynchronous requests (more than one request can be send and executed in the same time).

If we changed the code to be like in that file

session_start();
session_write_close();
sleep(5);

the second line in that code release the session file so the other requests now can start executing as they can call session_start() without any problems.

Happy coding :) till the next post remember to subscribe to the blog RSS feed and follow me on twitter.

Image source: codeinphp.com
Comments button Twitter button Facebook button LinkedIn button Google+ button

تعريب التطبيقات و المواقع

git

السلام عليكم :)

قمت مؤخرا بتطوير php class لانشاء ملف تعريب للمواقع و تطبيقات النترنت من نوع .po وهوا نوع من انواع الملفات عادتا يستخدم في نظام GetText ولمن لا يعرفة منكم هوا نظام يستخدم لكتابة برامج متعددة اللغات تستخدمة اكثر من لغة برمجية من ضمنهم PHP  ,وهناك مجموعة من الـ frameworksموجود كجزء اساسي بها مثل CakePHP لمزيد عن GetText يمكنكم زيارة صفحة ويكيبيديا http://en.wikipedia.org/wiki/Gettext

الـ Class تقوم بالبحث عن الكلمات التي تحتاج لترجمة و هي تكون علي الشكل  __(‘Hello World’) Or _e(“Hello again.”).  وتقوم بتجميعها في ملف واحد يتم انشائه بجوار الملف الرئيسي للكلاس, يمكن من خلال متغير $directory تحديد مكان المجلد المراد البحث فية و المتغير يقبل اسم مجلد او عدة مجلدات ضمن array و يتم البحث في المجلدات الفرعية في كل منهم و الاعداد الافتراضي هوا البحث في المجلد الخاص بتلك الكلاس, ايضا يمكن تحديد نوعية الملفات المراد البحث فيها من خلال المتغير $file_extensions الذي يقبل array من الامتدادات و الاعداد الافتراضي هوا جميع الملفات.

الكلاس التي قمت بتطويرها موجودة علي GitHub https://github.com/eslam-mahmoud/gettext-php-scanner يمكن للجميع استخدامها و ادعو الجميع للمشاركة في تطويرها.

Comments button Twitter button Facebook button LinkedIn button Google+ button

متابعة اداء موقعك

متابعة اداء موقعك شيء مهم لاي طور او صاحب موقع و متابعة الاداء تنقسم لعدة اقسام

  • متابعة الزيارات و مصدرها
  • متابعة حملاتك الاعلانية
  • متابعة اداء الخادم server الموقع
  • متابعة الاخطاء البرمجية و ملفات الـ log

وغيرها من الامور لكن اليوم اردت مشاركة جزء من كود برمجي حول النقطة الاخيرة لمتابعة ملفات الاخطاء و logs في موقعك جزء مما تحدثت عنة في محاضرة web applications scalability problems في مؤتمر CAT Scope12

الفكرة هي تقسيم ملفات التتبع و الاخطاء كل يوم ليسهل متابعة الاخطاء و المشاكل الكود مكتوب ليتم تنفيزة من خلال cron job

if (file_exists('../tmp/logs/debug.log')) {
rename('../tmp/logs/debug.log', '../tmp/logs/debug - '.date('Y-m-d',time()).'.log');
echo 'debug.log renamed' . '<br/>';
}
if (file_exists('../tmp/logs/error.log')) {
rename('../tmp/logs/error.log', '../tmp/logs/error - '.date('Y-m-d',time()).'.log');
echo 'error.log renamed' . '<br/>';
}

ما سيقوم بة هذا الجزء هوا اعادة تسمية ملفات التتبع و الاخطاء كل يوم باضافة تاريخ اليوم لاسم الملف لذا عندما يقوم الموقع بانشاء ملف جديد بالاخطاء في اليوم التالي يتم اعادة تسمية, هكذا تستطيع متابعة الاخطاء وما يحدث في موقعك بشكل دوري (الكود مكتوب داخل CakePHP و يجب تعديل مسار الملف ليتناسب مع موقعك)

Comments button Twitter button Facebook button LinkedIn button Google+ button

بداية مشروع HuntEvents.net

السلام عليكم

اليوم هوا البداية الحقيقة لمشروعي Hunt Events (http://huntevents.net) وهوا موقع متخصص في الـ events  يسمح للافراد بالاشتراك ثم يقوم بارسال تنبيهات بجديد الفعاليات و الاحداث علي حسب اهتماماتهم, بداء المشروع في Startup weekend alexandria وقد كتبت تدوينة عنة في 30-09-2011 فترة كبيرة حتي الان

مر المشروع بعدة مراحل و مشاكل و كعادة اي startup او مشروع ناشيء ما يواجة صعوبات و تحديات ربما اكتب عنها تدوينة او مجموعة من التدوينات المنفصلة حتي يستفيد منها الجميع لكن هذا ليس موضوعنا الان اليوم اردت ان اعلن عن الميلات الحقيقي للمشروع 01-05-2012 ركزنا في تلك المرحلة علي المشكلة الساسية التي تواجة المستخدم وهي الحاجة للحصول علي تنبيهات بالاحداث القادمة التي تهمة, ايضا يقوم الموقع بدور الـ Media sponsor للمجموعة من الفاعليات و المراكز وهذا من قبل بداية اطلاق المشروع, ايضا هذا ليس فقط كل ما يقدمة الموقع الباقيه تاتي تباعا

الفكرة بدائت كمشكلة شخصية واجهتها في صعوبة متابعة كل جديد من احداث في المجالات التي تهمني لذلك اليوم بداء Hunt events وشعارة “Never miss an important event ;)” ادعوكم لتجربة الموقع و ارسال التعليقات و الاقتراحات http://huntevents.net

Comments button Twitter button Facebook button LinkedIn button Google+ button

WordPress at Google summer of code 2011

Hello, Tomorrow will be the last chance if you think in applying for Google summer of code 2011 GSoC as in the program time line Student application deadline in April 8.

in GSoC 2011 wordpress is here with many ideas you can select form them or you may propose your own idea.

there are many ideas i like to see them come true like:

  1. Front End Postting integrated with admin bar
    • The P2 theme allows users to post directly from the front end. Extracting this functionality into the admin bar that could be used by any theme, would make it easier for users to have this functionality.
  2. Child Theme Management in WordPress
    • The WordPress theme directory does not currently accept child themes, as WordPress has no way of ensuring that people have the proper parent theme installed. This project would modify WordPress so that it could download child themes and resolve their dependency on a parent theme.
  3. Template Versioning
  4. Move WordPress

Good luck for every one :)

Comments button Twitter button Facebook button LinkedIn button Google+ button