وبلاگ فيکسل برای گرافيست ها
SharpLife وبلاگ شخصی مهدی تقی زاده
بازگشت شاهو طوفانی
اين صداگذاری و ميکس آخرشه!
نکته جالبی در مورد تابع output_add_rewrite_var
کاراکتر های فارسی در عکس توسط PHP
مصاحبه من با مجله وزین IranAMP
واژه های فناوری اطلاعات و برابر های پیشنهادی فرهنگستان
دوره های آموزش IT
استانداردهای کدنويسی PHP
| صفحه قبل


IranPHP
نماينده رسمي سايت PHP.net

webilix
منبعي براي برنامه نويسان PHP

phprun
وبلاگي خواندني براي تمام PHP كارها

ם تعداد بازديدكنندگان
كل: 924718
ديروز: 915
امروز: 768
ם تعداد كاربران آنلاين
9 نفر
ם پنج مراجعه آخر
sobesednikjm.hannnari.com
djdgjkfbf.chez.com
serx.wml.in
djdgjkfbf.chez.com
serx.wml.in
 
 
EasyRSS هديه بنده به شما
EasyRSS پریشب که سرم خلوت شد، گفتم یه نگاهی به اسکریپتهای سایت بندازم و یک سری Benchmark در مورد سرعت اجرای اسکریپتها، انجام بدم. برای این منظور IDE محبوبم razz یعنی Zend Studio 3.0 رو اجرا کردم و تحت IE روی Localhost یه Profile از Home Page سایت گرفتم. عجب نتایجی! shockedزمان اجرای اسکریپتهای صفحه اصلی سایت حدود ۱۳۳۹ میلی ثانیه شد! تعجب کردم و Functions Statistics رو بررسی کردم دیدم بعله! این News Feed سایت که با SAX API نوشته بودم، چیزی حدود ۷۹۰ میلی ثانیه از زمان اجرای کل رو بخودش اختصاص داده. کلاسی که برای این منظور نوشته بودم بررسی کردم دیدم راه بهینه تری نمی تونم پیدا کنم و باید یه فکر تازه تری بکنم تا این SimpleXML نسخه ۵ بیاد و ما رو نجات بده! یه جا خونده بودم که Tim Bray از کمک نویسندگان مشخصات XML گفته بود که از Perl Regex ها برای تفسیر اسناد XML استفاده میکنه. coolخوب فکر جالبیه. با اینکه اگه بخوایم مفسرهایی تمام و کمال بنویسیم با این روش یکم سخت هست اما برای مواردی که فقط قسمتهای خاصی از سند XML مورد نیاز باشه و این وسط DTD ها رو هم نادیده بگیریم، روشی هست که از نظر پرفورمنس و سرعت بسیار بسیار سریعتر از SAX و XPath هست و نسبت به DOM هم تفاوت فابل توجهی داره. بدین منظور، دیشب اومدم و یک کلاس نوشتم که خیلی راحت با دو خط کد! بتونید یک RSS Reader ساده و سریع به سایتتون اضافه کنید. از قابلیتهایی که این کلاس داره اینه که کاملا Template Base هست و می تونید کاملا به صورت جداگانه هر طرح و فرمی که میخواهید با HTML بسازید و با قراردادن یک سری نشانه ها، محل قرارگرفتن نام سایت، URL سایت، عناوین و لینک های مربوطه رو مشخص کنید. قابلیت دیگه اون، کش کردن فایل روی Server هست که با تعیین یک زمان انقضا News Feed شما بروزرسانی میشه. من تو این کلاس علاوه بر اینکه مفاهیم ابتدایی یک Template Engine رو از دید خودم پیاده سازی کردم، شما رو با یکسری توابعی که شاید کمتر باهاشون کار کرده باشید، آشنا میکنم. باز هم می گم که این کلاس خیلی خیلی ساده هست و تنها کاری که میکنه محتوای تگ title و link ها رو تفسیر میکنه. از اونجایی که من می بینم اکثرا از همین دو المنت در سایتها استفاده میکنند و معمولا XSL رو هم نادیده میگیرند، همین امکان رو بهش اضافه کردم(که ۱۰۰ درصد قابل تعمیم دادنه) بدین ترتیب سرعت اجرای اون کمتر از یک دهم زمان تفسیر RSS توسط SAX هست.
بعد از دریافت فایل فشرده از اينجا، محتویات اون رو عینا روی Serverتون آپلود کنید، یه دایرکتوری هست به نام rss_reader که می تونید نام دیگه ای براش انتخاب کنید، اگه نامش رو عوض کردید خط دوم کد زیر رو هم اصلاح کنید. در ضمن این دایرکتوری باید قابل نوشتن توسط کاربری باشه که وب سرور تحت اون اسکریپتها رو تفسیر میکنه(nobody) بنابراین CHMOD رو ۷۷۷ تنظیم کنید.

<?php
require('easyrss.class.php');
define('CACHEDIR''./rss_reader');
$rssSample = new EasyRSS('http://www.phpmystery/rss/'60'template.htm'CACHEDIR);
echo 
$rssSample->parseFeed();
?>

خط اول، کلاس EasyRSS رو اينکلود ميکنيم، خط دوم دايرکتوری کش رو مشخص ميکنيم. خط سوم از کلاسمون يک نمونه ميگيريم و تابع سازنده رو با آدرس کامل فايل RSS يا آدرس کامل مولد اون، زمان انقضا بر حسب دقيقه، نام و مسير سند HTML ای که بعنوان تمپليت استفاده خواهيم کرد و نهايتا مسير دايرکتوری کش، صدا میکنیم. در خط آخر هم با اجرای يک متد از کلاس خيلی قشنگ News Feed امون رو تحويل ميگيرم.
فعلا یکم عجله دارم توضیح بیشتر برای بعد، اگه کسی مشکلی داشت کامنت بگذاره.
نمونه اش هم اينجاست.
کد خود کلاس هم اینه:

<?php
class EasyRSS {
    var 
$rssUrl;
    var 
$xmlFile;
    var 
$expireTime;
    var 
$template;
    var 
$cachDir;
    var 
$xmlDocument;
    var 
$lastUpdate;
    function 
EasyRSS($rssUrl_in$expireTime_in$templateFileName_in$cacheDir_in) {
        
$this->rssUrl $rssUrl_in;
        
$this->xmlFile $cacheDir_in.'/'.$this->url2File();
        
$this->expireTime = (int)$expireTime_in;
        
$this->cachDir $cacheDir_in;
        
$this->template file_get_contents($templateFileName_in);
    }
    function 
url2File() {
        
$url parse_url($this->rssUrl);
        return 
ereg_replace('[^[:alnum:]]','_',$url['host']).'.xml';
    }
    function 
getFeed() {
        if (
is_writable($this->cachDir)) {
            
$xmlDocument implode (''file($this->rssUrl));
            if(!empty(
$xmlDocument)) {
                
$fp = @fopen($this->xmlFile,"w");
                
fwrite($fp,$xmlDocument);
                
fclose($fp);
                @
chmod($this->xmlFile,0766);
                return 
true;
            }
        } else {
            return 
false;
        }
    }
    function 
isExpired() {
        
$this->lastUpdate filemtime($this->xmlFile);
        return (
time() > $this->lastUpdate $this->expireTime 60) ? true false;
    }
    function 
parseFeed(){
        if (!
file_exists($this->xmlFile) || $this->isExpired()) {
            
$this->getFeed();
        }
        
$this->xmlDocument file_get_contents($this->xmlFile);
        
$pattern '/<title>([^<]*)/';
        
preg_match_all($pattern$this->xmlDocument$titles);
        
$pattern '/<link>([^<]*)/';
        
preg_match_all($pattern$this->xmlDocument$links);
        
$items = array();
        if (
PHP_VERSION '5.0') {
            for (
$counter 0$counter count($titles[1]); $counter++) {
                
$items[$titles[1][$counter]] = $links[1][$counter];
            }
        } else {
            
$items array_combine($titles[1], $links[1]);
        }
        return 
$this->parseTemplate($items);
    }
    function 
parseTemplate(&$results) {
        
$loopContent $finalOutput '';
        
$template $this->template;
        
$keys array_keys($results);
        
$values array_values($results);
        
$output str_replace('#WEBSITEURL#'$values[0], $template);
        
$output str_replace('#WEBSITE#'$keys[0], $output);
        
ereg('(.*)<!-- #STARTLOOP# -->(.*)<!-- #ENDLOOP# -->(.*)'$output$matches);
        for (
$counter 1$counter count($keys); $counter++) {
            
$loopContent .= str_replace('#LINK#'$values[$counter], $matches[2]);
            
$loopContent str_replace('#TITLE#'$keys[$counter], $loopContent);
        }
        
$matches[3] = str_replace('#LASTUPDATE#'date('Y-m-d@H:i:s'$this->lastUpdate), $matches[3]);
        
$finalOutput =$matches[1].$loopContent.$matches[3];
        return 
$finalOutput;
    }
}
?>

واژه نامه:
Code profiling در اصل، به معنی سنجش مدت زمانی است که اسکريپت اجرا ميشود.
 
نظرات شما(113)  
مطالعه موردی یک وب سرويس SOAP
XML Web Services امروز میخوام کمی در مورد Web Service ها و نحوه بکارگیری این خدمات توسط PHP صحبت کنم.
مقدمه
کسانی که تازه، وارد ِ وادی برنامه نویسی و اسکریپت نویسی میشن، همواره XML رو دیو دو شاخی می بینن که اصلا نمیشه حریفش شد و فکر می کنند این مفهوم خارج از کهکشان سایبر اومده و مثل shocked نیگاش میکنند!
در این پست که خیلی هم طولانی خواهد شد، میخوایم این دیو دو شاخ رو به زانو در بیاریم، البته به کمک PEAR و یه ذره سلیقه!
اصل قضیه
به زبان ساده، وب سرويسهای XML يک سری توابعی هستند که توسط سرويس دهنده ای در اينترنت در اختيار ما گذاشته می شه و ما می تونيم، اين توابع رو طوری در برنامه يا اسکريپت خودمون فراخوانی کنيم مثل اينکه اون توابع بصورت لوکال در دسترس مون هستند. تمام پروتوکلهای وب سرويس استاندارد، به فرمت سندهای XML بوده و رايج ترين اونها هم Simple Object Access Protocol يا به طور مختصر SOAP است.
وب سرويسهای SOAP معمولا با يک سند WSDL همراه هستند. WSDL مخفف Web Services Description Language می باشد و زبانی جهت توصيف وب سرويس هاست. سند WDSL وب سرويس GlobalWeather که من ميخوام به عنوان يک Case Study باهاش کارکنم در اين آدرس قرار داره:
http://live.capescience.com/wsdl/GlobalWeather.wsdl
ساده ترين راه برای استفاده از يک وب سرويس SOAP نظير GlobalWeather نصب پکيج PEAR::SOAP روی سرويس دهنده است.(برای دوستانی که با نصب PEAR آشنایی ندارند، بزودی مطالبی خواهم نوشت.) به مجرد نصب اين پکيج، می تونيم اسکريپتهای PHP، جهت بهره گيری از اين سرويس نوشت.
سرويس GlobalWeather به ما اجازه ميده تا ليستی از کشورها رو بازيابی کرده و فهرستی از فرودگاه های موجود در یک کشور خاص رو بدست بیاریم و نهایتا در مورد وضعیت آب و هوایی اون فرودگاه اطلاعاتی کسب کنیم. خوب؛ قسمت اول کد ما هم همين هدف رو دنبال می کنه:

<?php
require_once 'SOAP/Client.php';
$wsdl = new SOAP_WSDL(
  
'http://live.capescience.com/wsdl/GlobalWeather.wsdl');
//...
?>

اولين گام، همونطور که مشاهده می کنيد، خواندن سند WSDL وب سرويسی هست که ميخوايم ازش استفاده کنيم. بعد ِ اون يک آبجکت می سازيم که حاوی توابعيه که توسط وب سرويس ارائه ميشه. به اين آبجکت Proxy میگیم.

<?php
//...
$weather $wsdl->getProxy();
//...
?>

اولين کاری که بايد با پراکسی انجام بديم، فراخوانی تابع listCountries هست. خروجی اين تابع از نوع آرايه است، که از اون برای پر کردن يک منوی Drop-Down استفاده خواهيم کرد. کار رو می سپاريم به ساختار foreach که اين امکان رو به ما میده المنتهای يک آرايه رو خيلی راحت تراورس کنيم.(آخ که حال ميکنم با اين ساختارهايی که اينقدر کار رو راحت ميکنه suprised)

<?php
//...
$countries $weather->listCountries();
$select '<select name="country">';
foreach (
$countries as $country) {
  
$select .= '<option>' $country '</option>';
}
$select .= '</select>';
//...
?>

حالا اگه کاربر، يک کشور رو از ليست پايين افتادنی(Drop-Down) انتخاب کنه، نوبت فراخواني ِ تابع searchByCountry وب سرويس هست تا تمام فرودگاه های اون کشور رو ليست کنه و در يک جدول HTML نمايش بده.

<?php
//...
$table '';
if (isset(
$_GET['country']) and
    
in_array($_GET['country'], $countries)) {
  
$table '<table>';
  
$table .= '<tr><th>Airports in ' $_GET['country'] .
            
'</th></tr>';

  
$airports $weather->searchByCountry($_GET['country']);

  foreach (
$airports as $airport) {
    
$table .= '<tr><td>' $airport->string '</td></tr>';
  }
  
$table .= '</table>';
}
?>

در مورد تکه اسکريپت بالا هم توضيح خاصی نمی بينم. ولی از اونجايی که PHP يک زبان Loosly Type هست، ابتدا ما متغير table$ را با مقدار رشته کاراکتر تهی مقدار دهی اوليه می کنيم تا با Notice های بيخود مواجه نشيم. توجيه ديگش هم اينه که ابتدا جدول ما بايد خالی باشه. (یعنی قبل از انتخاب کشور از منوی پایین افتادنی)
بعد نکته بعدی اينکه اگه بخواهید متغيرهای GPC رو استفاده کنيد اول از تابع ()isset برای مطمئن شدن از گرفتن مقدار اوليه متغير کمک بگيريد. با استفاده از اين تابع همونطور که گفتم با Notice های اعصاب خرد کن برخورد نمی کنيم.(همیشه در زمان طراحی Error Reporting روی E_ALL باشه و فقط در محیط Productive هست که E_ALL ~ E_NOTICE توصیه میشه)
مثل اينکه زيادی زدم تو آفسايد! confused ولی خوب اين نکته ها، برای بعضی ها ميتونه مفيد باشه.
در نهايت با کمی HTML نوشتن ماحصل کار خودمون رو مشاهده خواهيم کرد:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> Global Weather Service </title>
<meta http-equiv="Content-Type"
  content="text/html; charset=iso-8859-1" />
</head>
<body>
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Pick a Country: <?php echo $select?>
<input type="submit" value="Search" />
</form>
<?php echo $table?>
</body>
</html>

فقط حواستون باشه که برخی کشورها، مثل ايالات متحده، فرودگاه های زيادی دارن و ممکنه باعث Timeout(گذر وقت!) شدن اسکريپت بشه چون ممکنه زمان زیادی برای واکشی تمام داده ها صرف بشه.
حالا ديديد استفاده از وب سرويسهای XML چقدر راحت و سادست؟! cool
 
نظرات شما(99)  
خبرنامه 175 Zend و بحثها و نظرهای اخير
XML SimpleXML اولين اکستنشنی هست که از امکانات پيشرفته آبجکت PHP 5 بهره می بره و اين ميتونه برای توسعه دهندگان اپليکيشنهای مبتنی بر PHP، بعنوان کاربران نهايی گيج کننده باشه؛ چونکه المنتها و مشخصه های(Attributes) سند XML بصورت آبجکت در اختيار قرار می گيره. چنانچه بخواهيد بصورت String هم بهشون دسترسی داشته باشيد، در Zend Engine 2 ميتونيد با يک Cast ساده به اين مهم برسيد. اين ممکنه روش تر و تميزی نباشه، اما تا وقتی که روش بهتری يافت نشه بهترين راه حل هست.(به نقل از خبرنامه شماره ۱۷۵ Zend)

<?php
echo (string)$sxe_obj
?>

خبر بعدی اينکه راسموس(*) فهميده که تابع ()get_browser و کد مرتبطش دارای مشکلاتی هست و در بسياری از موارد جواب نميده. پیشنهادش این بوده که این تابع رو به PECL منتقل کنند تا بصورت مستقل روش کار بشه، راسموس معتقده که PECL محل مناسبی برای توسعه اکستنشنهای PHP هست.
لازم به توضیحه که کار این تابع این هست که قابلیتهای مرورگر کاربر را تشخیص میده مثلا نسخه اصلی و نسخه جزئی مرورگر يا پذيرش کوکی و فعال بودن جاوا اسکريپت و ... رو می تونيد از طريق آبجکتی که بعنوان خروجی بر می گردونه تعيين کنيد. برای اینکه این تابع کار کنه باید دستورالعمل(Directive) با نام browscap در فایل پیکربندی php.ini به مکان فایل browscap.ini در سیستم اشاره کنه. این فایل رو می تونید از اينجا بروز کنید.
نمونه مثال موجود در راهنمای PHP رو عینا در پایین مشاده می کنید:

<?php
echo $_SERVER['HTTP_USER_AGENT'] . "<hr />\n"
$browser get_browser(); 
foreach (
$browser as $name => $value) { 
   print 
"<b>$name</b> $value <br />\n"

?>

خوب با اين تفاسير ديگه به اين تابع نميشه اعتماد کرد؛ توجه داشته باشيد که اين تابع فقط ميگه مرورگر طرف قابليت پذيرش کوکی رو داره يا نه ولی نميگه که آيا کاربر اجازه پذيرش کوکی رو داده يا نه! يعنی شما با دستور بالا تنها از امکاناتی که نسخه مرورگر بازديد کننده داره اطلاع حاصل ميکنيد و می تونيد بر اساس اون کارهای مختلفی از جمله تنظيم لايوت و CSS رو انجام بديد. بهترين روش هم برای تست کوکی هم اينه که کوکی ست ميکنيم بعد مقدارش رو می خونيم، با استفاده از تابع ()isset می فهميم که آیا کوکی ست شده.

(*) راسموس کيه؟! ای بابا! راسموس لردرف مهندس نرم افزار، عضو تيم آپاچی و خالق و نيروی محرکه PHP هست.(رحمت خدا بر او و خاندانش باد)
 
نظرات شما(10)  
صفحه بعد |
 
 
نام: نيما شايافر
متولد: 7/7/1362
تحصيلات: دانشجو
شغل: طراح وب و برنامه نويس
وضعيت: آفلاين

ماهيانه
مرداد 86 (2)
خرداد 86 (1)
دي 84 (4)
آذر 84 (5)
مرداد 84 (1)
تير 84 (1)
ارديبهشت 84 (2)
دي 83 (1)
آذر 83 (2)
آبان 83 (2)
مهر 83 (4)
شهريور 83 (6)
مرداد 83 (3)
تير 83 (7)
خرداد 83 (7)
ارديبهشت 83 (8)
فروردين 83 (13)
اسفند 82 (12)

موضوعي






جستجوي پيشرفته

BlogRolling is currently inaccessible.
©2004, Design & Developed by: Nima Shayafar. All rights reserved.