بایگانی برای ‘php’ دسته

راهنمای نصب php بر روی سرور

چهارشنبه, ۷ بهمن ۱۳۸۸

چند روز قبل در سایت رسمی php راهنمای کاملی برای نصب php بر روی سرورهای یونیکس ، ویندوز و  Mac OS X با وب سرورهای لایتی و آپاچی نسخه ۱ و ۲ و IIS نسخه ۵ و ۶ و ۷  و نصب اکستنشن های PECL و …

Installation and Configuration

فیلترهای php و چگونه از آنها استفاده کنیم

پنجشنبه, ۲۶ آذر ۱۳۸۸
فیلتر ها در php چه هستند؟
اگر شما هر اسکریپت php نوشته باشین و به استفاده عموم گذاشته باشید باید بدونید که به کاربران نباید اعتماد کرد،فیاترهای php گامیست برای حل این مشکل.فیلترهای php توسط اکستنشن فیلترهای php اجرا می شوند.اکستنشن فیلتر قوانین از پیش تعریف شده ایست برای تمیز کردن ورودی های کاربر و آماده کردن اطلاعات برای ذخیره در دیتابیس و یا هر کار دیگر…
فیلرتهای php چگونه کار می کنند؟
فیلترهای php یک جفت از توابع داخلی هستند که filter_var() و filter_var_array() نامیده می شوند و شما پرچمهایی به این متدها می توانید عبور دهید.فیلترهای عبور داده شده به این توابع فیلترهایی که شما می خواهید را اجرا خواهد کرد.
دو نوع فیلتر وجود دارد :فیلترهای اعتبار سنجی که شبیه چک کردن true/false هستند.وقتی از فیلترهای اعتبار سنجی استفاده می کنید و تابع داده ی اصلی را بر می گرداند یعنی چک کردن اطلاعات انجام شده.و وقتی از تمیز کاری ( sanitization)  استفاده می کنید برای با موفقیت عبور کردن از تست ، اطلاعاتی مهم از اطلاعات ]عبور داده شده  |وارد شده به تابع[ حذف  شده و بعد  مقدار نهایی برگدانده می شود.
برای اینکه ببینید چه فیلترهایی در محیط شما پشتیبانی میشود یک تایع جذاب به نام filter_list() وجود دارد:
این فیلترهایی است که در سرور من پشتیبانی میشود و ممکن است برای شما فرق داشته باشد،حالا نگاهی به چند مثال می کنیم تا ببینیم با این توابع چه کار میتوانیم انجام دهیم.
اگر در مورد توابع filter_var() و filter_var_array() اطلاعات بیشتری میخواهید به راهنمای php مراجعه کنید.
اعتبار سنجی اعداد صحیح
شما میتوانید صحت اعداد صحیح با فلگ FILTER_VALIDATE_INT بسنجید.اگر به تابع عددی صحیح بفرستید همان را بر می گرداند و اگر عددی اعشاری یا رشته بفرستید NULL یا FALSE  برخواهد گشت.
شما می توانید برای فلگ  FILTER_VALIDATE_INT اختیاراتی مشخص کنید.مثل کمترین min بیشترین max و مقدار پیش فرض.البته در تعریف آرایه ی $option باید دقت کنید چون یک آرایه ی چند بعدی است.
توجه کنید که دستور filter_var() دوم مقدار ۳ را بر می گرداند،چون مقدار default در متغیر $option تعیین شده است.
اعتبار سنجی اعداد اعشاری
اعتبار سنجی اعداد اعشاری مانند اعداد صحیح است ،ولی از فلگ FILTER_VALIDATE_FLOAT استفاده می شود و اگر اطلاعات داده شد عدد اعشاری باشد همان مقدار بازگردانده می شود.
اعتبار سنجی آدرس ایمیل
همچنین از این متد میتوانید برای هر نوع داده  ی مطلق دیگری استفاده کنید،مثل آدرس های ایمیل.
البته این متد نمیتواند به خوبی یک عبارت منظم سفارشی عمل کند.یک آدرس ایمیلی مثل a@a.a به طور واضحی نا معتبر است،ولی در این تابع معتبره!؟عبارت منظم زیر میتونه راه حل بهتری باشه:
اعتبار سنجی URLها
اعتبار سنجی url ها به طور معمول سخت است،filter_var یک روش بسیار زیباست.چیز جالب در مورد این فلگ ، آپشن های اضافیست که میتواند اعتبار سنجی بهتری فراهم کند.این اضافات اینها هستند:
FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED
به این مثال نگاه کنید:
اعتبار سنجی آی پی آدرس ها
اعتبار سنجی آی پی ها بسیار سادست و فلگ  FILTER_VALIDATE_IP به شما اجازه استفاده از چند آپشن اضافه را می دهد ، آنها در زیر لیست شده و حتی میتوانید آی پی های ورژن ۶ را هم چک کنید.
توجه کنید که ۵۴۳٫۱۵۲٫۳٫۹ مقدار false را بر گردانده است چون بزرگترین آدرسی که قابل قبول است ۲۵۵٫۲۵۵٫۲۵۵٫۲۵۵
FILTER_FLAG_NO_PRIV_RANGE و FILTER_FLAG_NO_RES_RANGE برای چک کردن ip خصوصی و رزو شده می باشد.
فیلترهای تمیزکاری مفید در php
تمیز کاری یک رشته
تمیز کاری داده ها به آسانی اعتبار سنجی آنهاست.به خاطر داشته باشید که تمیز کاری و اعتبار سنجی ، با هم تفاوت دارند چون در تمیز کاری ما کاراکترهای غیر دلخواه را حذف کرده و داده معتبر جدیدی را بر می گردانیم.حالا نگاهی به تمیزکاری یک رشته می کنیم.
تمیز کاری اعداد صحیح
فیلتر callback
شاید یکی از بهترین چیزها در مورد تابع  filter_var() فلگ FILTER_CALLBACK هست که به شما اجازه تعریف                                              قانون خودتون را به وسیله callback function می دهد.اگر نمیتوانین یک قانون که حتما به اون برمی خورید پیدا کنید ،

PHP Filters and How to Use Them

فیلتر ها در php چه هستند؟

اگر شما هر اسکریپت php نوشته و به استفاده عموم گذاشته باشید باید بدونید که به کاربران نباید اعتماد کرد،فیلترهای php گامیست برای حل این مشکل.فیلترهای php توسط اکستنشن فیلترهای php اجرا می شوند.اکستنشن فیلتر قوانین از پیش تعریف شده ایست برای تمیز کردن ورودی های کاربر و آماده کردن اطلاعات برای ذخیره در دیتابیس و یا هر کار دیگر...

فیلرتهای php چگونه کار می کنند؟

فیلترهای php یک جفت از توابع داخلی هستند که filter_var() و filter_var_array() نامیده می شوند و شما پرچمهایی به این متدها می توانید عبور دهید.فیلترهای عبور داده شده به این توابع فیلترهایی که شما می خواهید را اجرا خواهد کرد.

دو نوع فیلتر وجود دارد :فیلترهای اعتبار سنجی که شبیه چک کردن true/false هستند.وقتی از فیلترهای اعتبار سنجی استفاده می کنید و تابع داده ی اصلی را بر می گرداند یعنی چک کردن اطلاعات انجام شده.و وقتی از تمیز کاری ( sanitization)  استفاده می کنید برای با موفقیت عبور کردن از تست ، اطلاعاتی مهم از اطلاعات ]عبور داده شده  |وارد شده به تابع[ حذف  شده و بعد  مقدار نهایی برگدانده می شود.

برای اینکه ببینید چه فیلترهایی در محیط شما پشتیبانی میشود یک تایع جذاب به نام filter_list() وجود دارد:

print_r(filter_list());

//prints...

Array
(
    [0] => int
    [1] => boolean
    [2] => float
    [3] => validate_regexp
    [4] => validate_url
    [5] => validate_email
    [6] => validate_ip
    [7] => string
    [8] => stripped
    [9] => encoded
    [10] => special_chars
    [11] => unsafe_raw
    [12] => email
    [13] => url
    [14] => number_int
    [15] => number_float
    [16] => magic_quotes
    [17] => callback
)

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

اگر در مورد توابع filter_var() و filter_var_array() اطلاعات بیشتری میخواهید به راهنمای php مراجعه کنید.

اعتبار سنجی اعداد صحیح

شما میتوانید صحت اعداد صحیح با فلگ FILTER_VALIDATE_INT بسنجید.اگر به تابع عددی صحیح بفرستید همان را بر می گرداند و اگر عددی اعشاری یا رشته بفرستید NULL یا FALSE  برخواهد گشت.

$var = 473;

filter_var($var, FILTER_VALIDATE_INT); //returns 473

$var = 'hello';

filter_var($var, FILTER_VALIDATE_INT); //returns FALSE

$var = 71.4;

filter_var($var, FILTER_VALIDATE_INT); //returns FALSE

شما می توانید برای فلگ  FILTER_VALIDATE_INT اختیاراتی مشخص کنید.مثل کمترین min بیشترین max و مقدار پیش فرض.البته در تعریف آرایه ی $option باید دقت کنید چون یک آرایه ی چند بعدی است.

$var_1 = 73;
$var_2 = 246;

$options = array(
    'options' => array(
        'default' => 3,
        'min_range' => 0,
        'max_range' => 99,
    )
);

filter_var($var_1, FILTER_VALIDATE_INT, $options); //returns 73

filter_var($var_2, FILTER_VALIDATE_INT, $options); //returns 3

توجه کنید که دستور filter_var() دوم مقدار ۳ را بر می گرداند،چون مقدار default در متغیر $option تعیین شده است.

اعتبار سنجی اعداد اعشاری

اعتبار سنجی اعداد اعشاری مانند اعداد صحیح است ،ولی از فلگ FILTER_VALIDATE_FLOAT استفاده می شود و اگر اطلاعات داده شد عدد اعشاری باشد همان مقدار بازگردانده می شود.

$var_1 = 45.3;
$var_2 = 246;

filter_var($var_1, FILTER_VALIDATE_FLOAT, $options); //returns 45.3

filter_var($var_2, FILTER_VALIDATE_FLOAT, $options); //returns 246

اعتبار سنجی آدرس ایمیل

همچنین از این متد میتوانید برای هر نوع داده  ی مطلق دیگری استفاده کنید،مثل آدرس های ایمیل.

$var_1 = "jordan@17webshop.com";

$var_2 = "some data that is obviously not an e-mail address;

filter_var($var_1, FILTER_VALIDATE_EMAIL); //returns jordan@17webshop.com

filter_var($var_2, FILTER_VALIDATE_EMAIL); //returns FALSE

البته این متد نمیتواند به خوبی یک عبارت منظم سفارشی عمل کند.یک آدرس ایمیلی مثل a@a.a به طور واضحی نا معتبر است،ولی در این تابع معتبره!؟عبارت منظم زیر میتونه راه حل بهتری باشه:

$pattern = '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/';

$email_1 = 'jordan@17webshop.com';

$email_2 = 'a@a.a';

preg_match($pattern, $email_1); // returns TRUE

preg_match($pattern, $email_2); //returns FALSE

اعتبار سنجی URLها

اعتبار سنجی url ها به طور معمول سخت است،filter_var یک روش بسیار زیباست.چیز جالب در مورد این فلگ ، آپشن های اضافیست که میتواند اعتبار سنجی بهتری فراهم کند.این اضافات اینها هستند:

FILTER_FLAG_SCHEME_REQUIRED

FILTER_FLAG_HOST_REQUIRED

FILTER_FLAG_PATH_REQUIRED

FILTER_FLAG_QUERY_REQUIRED

به این مثال نگاه کنید:

$var_1 = 'http://www.17webshop.com';

$var_2 = 'http://www.17webshop.com/path/to/some/file';

$var_3 = 'http://www.17webshop.com/path/to/some/file/?foo=bar';

$var_4 = 'www.17webshop.com';

$var_5 = 'some_file.html';

$var_6 = "/path/to/some/file";

filter_var($var_1, FILTER_VALIDATE_URL); // returns http://www.17webshop.com

filter_var($var_1, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED); // returns FALSE

filter_var($var_2, FILTER_VALIDATE_URL); // returns http://www.17webshop.com/path/to/some/file

filter_var($var_2, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED); // returns FALSE

filter_var($var_3, FILTER_VALIDATE_URL); // returns http://www.17webshop.com/path/to/some/file/?foo=bar

filter_var($var_4, FILTER_VALIDATE_URL); // returns FALSE

filter_var($var_5, FILTER_VALIDATE_URL); // returns FALSE

filter_var($var_6, FILTER_VALIDATE_URL); // returns FALSE

اعتبار سنجی آی پی آدرس ها

اعتبار سنجی آی پی ها بسیار سادست و فلگ  FILTER_VALIDATE_IP به شما اجازه استفاده از چند آپشن اضافه را می دهد ، آنها در زیر لیست شده و حتی میتوانید آی پی های ورژن ۶ را هم چک کنید.

$var_1 = '192.168.0.1';

$var_2 = '543.152.3.9';

$var_3 = '3ffe:1900:4545:3:200:f8ff:fe21:67cf';

echo filter_var($var_1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // returns 192.168.0.1

echo filter_var($var_2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // returns FALSE

echo filter_var($var_3, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); // returns 3ffe:1900:4545:3:200:f8ff:fe21:67cf

توجه کنید که ۵۴۳٫۱۵۲٫۳٫۹ مقدار false را بر گردانده است چون بزرگترین آدرسی که قابل قبول است ۲۵۵٫۲۵۵٫۲۵۵٫۲۵۵

FILTER_FLAG_NO_PRIV_RANGE و FILTER_FLAG_NO_RES_RANGE برای چک کردن ip خصوصی و رزو شده می باشد.

فیلترهای تمیزکاری مفید در php

تمیز کاری یک رشته

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

$var_1 = '<tag>some string data</tag>';

$var_2 = '<tag>"some string data"</tag>';

filter_var($var_1, FILTER_SANITIZE_STRING); //returns some string data

filter_var($var_2, FILTER_SANITIZE_STRING); //returns "some string data"

تمیز کاری اعداد صحیح

$var_1 = 123214;

$var_2 = '213h34bh312';

filter_var($var_1, FILTER_SANITIZE_NUMBER_INT); //returns 123214

filter_var($var_2, FILTER_SANITIZE_NUMBER_INT); //returns 21334312

فیلتر callback

شاید یکی از بهترین چیزها در مورد تابع  filter_var() فلگ FILTER_CALLBACK هست که به شما اجازه تعریف قانون خودتون را به وسیله callback function می دهد.اگر نمیتوانین یک قانون که حتما به اون برمی خورید پیدا کنید ،

function my_rule($str) {
  return str_replace(" ", "+", $str);
}

$var_1 = "some string data with spaces in it";

$options = array(
    'options' => 'my_rule'
);

filter_var($var_1, FILTER_CALLBACK, $options); //returns some+string+data+with+spaces+in+it

نصبphpmyadmin php mySQL apache روی ubuntu 9.10

جمعه, ۶ آذر ۱۳۸۸

منبع:Installing Apache2 With PHP5 And MySQL Support On Ubuntu 9.10

آپاچی ۲٫۲٫۱۲ – php 5.2 – mySQL 5.1 – phpMyAdmin 3.2.2

۱.توجه ابتدایی:

تمامی دستورات این مقاله با دسترسی root اجرا میکنم و شما هم مطمئن بشین این دسترسی دارید:

sudo su

۲٫نصب mysql5

اول از همه mysql5 با دستور زیر نصب میکنیم:

aptitude install mysql-server mysql-client

بعد  از شما پسوردی برای کاربر root@localhost پرسیده میشه ُدقت داشته باشید که ما بعدا این پسورد را تغییر نمی دهیم:

New password for the MySQL "root" user: &lt;-- yourrootsqlpassword
Repeat password for the MySQL "root" user: &lt;-- yourrootsqlpassword

۳٫نصب آپاچی۲

آپاچی۲ در بسته اوبونتو وجود داره و با این دستور نصب میشه:

aptitude install apache2

حالابه آدرس http://127.0.0.1 برید و صفحه یپش فرض سرور (It works!) باید ببینید.

ubuntu_it_works_apache2

مسیر پیش فرض ریشه وب سرور

/var/www

فایل پیکربندی

/etc/apache2/apache2.conf

ماژول های آپاچی

/etc/apache2/mods-enabled

هاست های مجازی

/etc/apache2/sites-enabled

۴.نصب php5

ما به اینصورت میتونیم php5 و ماژول php5 آپاچی نصب کنیم:

aptitude install php5 libapache2-mod-php5

ما باید آپاچی ری استارت کنیم:

/etc/init.d/apache2 restart

۵.تست php5 و جزئیات بیشتر

در مسیر پیشفرض وب سایتها /var/www ما فایلی با نام info.php ایجاد میکنیم تا جزئیات بیشتری در مورد php ببینیم:

vi /var/www/info.php
<?php
phpinfo();
?>

حالا اگه به آدرس http://127.0.0.1/info.php بریم:

ubuntu_php52_info

همونطور که میبینیم php5 کار میکنه.اگه پایینتر بریم ماژولهایی که در دسترسن میبینیم و لی mysql تو این لیست نیست یعنی تا الان نمیتونیم از mysql استفاده کنیم.

۶.پشتیانی mysql در php5

برای پشتیبانی mysql در php ما باید بسته php5-mysql نصب کنیم.این ایده خوبیه برای نصب ماژولهایی که تو برنامه هاتون ازش استفاده می کنید.

لیست ماژولهای نصب شده میتونید با دستور زیر ببینید:

aptitude search php5

هر کدوم که می خواین انتخاب و نصبشون کنید:

aptitude install php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-json

آپاچی دوباره ری استارت می کنیم:

/etc/init.d/apache2 restart

دوباره به آدرس http://127.0.0.1/info.php برید و تو پائین صفحه میتونید ماژولهای جدیدی که نصب شدن ببینید.ماژول mysql هم اونجاست:

ubuntu_php_info_mysql

phpmyadmin یک رابط گرافیکی تحت وب هست برای مدیریت بانک اطلاعاتی mysql:

aptitude install phpmyadmin

شما سوالای زیرو به این صورت جواب بدید:

Web server to reconfigure automatically: &lt;-- apache2
Configure database for phpmyadmin with dbconfig-common? &lt;-- No

حالا در آدرس http://127.0.0.1/phpmyadmin شما به phpmyadmin دسترسی دارید.

ubuntu_phpmyadmin

نصب php و nginx روی CentOS

سه شنبه, ۳ آذر ۱۳۸۸

منبع:Red Hat / CentOS Install nginx PHP5 FastCGI Webserver

قدم اول:فعال کردن EPEL

ngnix به صورت پیش فرض موجود نیست و برای نصب نسخه stable باید EPEL را فعال کرد:

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/$(uname -m)/epel-release-5-3.noarch.rpm

قدم دوم:نصب ngnix

# yum install nginx

فایلهای پیکربندی nginx

مسیر پیش فرض فایل کانفیگ:

/etc/nginx/nginx.conf

مسیر پیش فرض تنظیمات SSL :

/etc/nginx/conf.d/ssl.conf

مسیر پیش فرض کانفیگ میزبانان مجازی:

/etc/nginx/conf.d/virtual.conf

مسیر پیش فرض ریشه وب سایت:

/usr/share/nginx/html

نصب و پیکربندی PHP به صورت FastCGI

# yum install php-pear-Net-Socket php-pear php-common php-gd php-devel php php-mbstring php-pear-Mail php-cli php-imap php-snmp php-pdo php-xml php-pear-Auth-SASL php-ldap php-pear-Net-SMTP php-mysql

Install spawn-fcgi simple program for spawning FastCGI processe

# yum install spawn-fcgi

و دانلود spawn-fcgi init.d shell:

# wget http://bash.cyberciti.biz/dl/419.sh.zip
# unzip 419.sh.zip
# mv 419.sh /etc/init.d/php_cgi
# chmod +x /etc/init.d/php_cgi

شروع به کار سرور PHP:

# /etc/init.d/php_cgi start
# netstat -tulpn | grep :9000

به صورت پیش فرض php روی پورت ۹۰۰۰ سرویس میده و با ویرایش فایل /etc/nginx/nginx.conf باید به nginx بفهمونیم:

# vi /etc/nginx/nginx.conf

با uncomment کردن کد زیر : (تو منبع اصلی این آموزش فکر میکنم این تکه کد ایراد داشته باشه)

location ~ \.php$ {

root           html;

fastcgi_pass   127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;

include        /etc/nginx/fastcgi_params;

}

nginx ری استارت می کنیم:

# service nginx restart

در مسیر /usr/share/nginx/html/test.php فایل جدید می سازیم و در بروزر باز میکنیم:

<?php
     phpinfo();
?>

phpتابعی – قسمت ۲ – درک و پیاده سازی توابع map و reduce

پنجشنبه, ۱۹ شهریور ۱۳۸۸

Understanding and Implementing the famous map and reduce functions

تو بخش اول ما فرق بین توابع بی نام(anonymous functions) و lambda و closure ها رو فهمیدیم.lambda و توابع بی نام در اصل یک ایده هستند:توابع مقادیری هستند مانند اعداد صحیح و رشته ها.closure ها قادر هستند lambda ها رو ارجاع بدن به یا استفاده کنند از مقادیری که بیرون lambdaها تعریف شدند.even after those variables have fallen out of scope.

ما در مورد پروانه ها ، پرنده ها و زنبورها بحث می کنیم.

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

می تونین به توابع دیگری که به ورودی تغییر شکل میدهند و به خروجی ارسال میکنند بگین؟

توابع تغییر شکل دهنده زیادی وجود دارند.

 function square($x) { return x * x; }
 strtolower
 function filter($dirty) { /* clean up */ return $clean; }

بعضی ها مانند square یک ورودی گرفته و خروجی از همان نوع را برمیگردانند int->int .بعضی ها مانند (تابع) metamorphosis (دگرگیسی) یک نوع ورودی میگیرن و در خروجی نوع دیگه دیده می شود کرم->پروانه

تابع تغییر شکل – transformer functions

transformer

آیا انواع دیگری از توابع نیز هستند؟الان همون وقتیه که ما در مورد پرنده ها و زنبورها حرف می زنیم.تو تفکر دوم بزارین بچسبیم به پروانه ها.وقتی دو پروانه تو یک راستا میان پیش هم یک پروانه ی جدید می سازن.(بله من میدونم این یک قیاس اشتباهه) البته در مورد فکر کردن به جزئیات اینکه چگونه دو پروانه پیش هم میان خودداری و بر روی زیبایی آنچه اتفاق می افتد تمرکز می کنیم.دو پروانه برای ساختن یکی به هم می پیوندند(پروانه و پروانه)->(پروانه).این یک تابع جدیده ، تابع combiner .که ۲ چیز یکسان را می گیرد و نتیجه یک چیز دیگر از همان نوع است.
combiner
حالا ما با map ، reduce و برنامه نویسی تابعی php چه کار خواهیم کرد؟
map و reduce جز توابع high-order هستند این بدین معنیست که هر کدام پارامتری دارند که تابع هست البته نه هر تابعی. هر کدام یک نوع تابع مخصوص را میگیرند. map از تابع تغییردهنده (transformer) استفاده می کنه و reduce از تابع ترکیب کننده (combiner).تغییر شکل در map لیستی از چیزهایی ، میتونیم بگیم مثل یک مشت کرم ، داخل لیستی از چیزهای دیگه ، مانند پروانه ها .reduce کاهش می دهد یک لیست از چیزها را مانند پروانه تا وقتی که فقط یکی باقی بماند.در اینجا تصویری از اینکه map و reduce چگونه کار میکنند می بینیم:
map-reduce-butterflies-small
map تغییر شکل میده لیستی از چیزهارو به لیستی از چیزهای دیگه.reduce ترکیب میکنه لیستی از چیزهارو به یک چیز،حالا این چیش شبیه php؟
php دو تابع داخلی داره:array_map و array_reduce
callback معانی مختلفی در php دارد که در قسمت بعد این نوشته ها کاملا پوشش داده میشه ولی الان callback در اینجا به معنی anonymous function (توابع بی نام ) هست.
استاندارد مثال map و reduce شمارش کلمات است.بزارین در php کمی به چالش بیفتیم:یک آرایه از رشته ها را میگیریم و باید تعداد هر کلمه رو تو کل رشته ها بشماریم. ورودی و خروجی مورد نظر رو میبینیم:
<?php
$lines = array(
             'one two three four',
             'two three four',
             'three four',
             'four',
             );
// Desired Output, array of type word => count
// array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, )
?>
بزارین ببنیم در مورد این مساله چی میدونیم:
ورودی: (رشته ای از کلمات)
خروجی: (آرایه(کلمات=>تعدادشون))
ما احتیاج داریم ورودیو از نوع خودش بگیریم و خروجیو در نوع خودش بدیم،چگونه میتونیم از تابع تغییر شکل برای رفتن نصف راه استفاده کنیم؟و چطور یک reducer ما رو به مقصدمون میرسونه؟به کرم ها و پروانه ها فکر کنید.
Our caterpillar is a plain old, space delimited, lowercase string.
تابع تغییر شکل ما یک رشته را میگیرد و بعد از دگرگیسی اونو به پروانه تبدیل می کنه،نوع خروجی:آرایه ای که کلیدهاش کلمات و مقادیرش تعدادشون هستند. (کلمات به صورت پشت سر هم)->(آرایه:کلمات=>تعدادشون).خب اینم کد تابع تغییر شکل بی نام که از یکی از توابع داخلی php به نام array_count_values استفاده کردیم.
<?php
// Transforms (Line of Words) -> (Array: Word => Count)
$lineToWordCounts =
    function($line) {
        return array_count_values(explode(' ', $line));
    };

// Test on a single line:
var_export($lineToWordCounts('one two three four'));
// Output: array ( 'one' => 1, 'two' => 1, 'three' => 1, 'four' => 1, )

// Test with array_map:
$counts = array_map($lineToWordCounts, $lines);
var_export($counts);
// Output: array ( 0 => array ( 'one' => 1, 'two' => 1, 'three' => 1, 'four' => 1, ),
//                 1 => array ( 'two' => 1, 'three' => 1, 'four' => 1, ),
//                 2 => array ( 'three' => 1, 'four' => 1, ),
//                 3 => array ( 'four' => 1, ), )
?>
رشته ها به پروانه ها تبدیل میشن و ما باید اونهارو در یک آرایه ترکیب کنیم،اگر ما یک تابع combiner (ترکیب کننده) بنویسیم که دو آرایه از تعداد کلمات بگیره و اونو در یک آرایه ترکیب کنه ، میتونیم از reduce برای ترکیب آرایه ها در یک آرایه استفاده کنیم .
<?php
// Combiner (Array:Word=>Count,Array:Word=>Count)->(Array:Word=>Count)
$sumWordCounts =
    function($countsL, $countsR) {
        // Get all the words
        $words = array_merge(array_keys($countsL), array_keys($countsR));
        $out = array();
        // Put them in a new (Array: Word => Count)
        foreach($words as $word) {
            // Sum their counts
            $out[$word] = isset($countsL[$word]) ? $countsL[$word] : 0;
            $out[$word] += isset($countsR[$word]) ? $countsR[$word] : 0;
        }
        return $out;
    };
$totals = array_reduce($counts, $sumWordCounts, array());
var_export($totals);
// Output: array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, )
?>
ما با استفاده از توابع داخلی پی اچ پی array_map و array_reduce و از lambda های تغییر شکل و ترکیب کننده یک شمارشگر چند خطی کلمات پیاده سازی کردیم. قسمت map هر خطو از رشته به آرایه ای از تعداد کلمات اون خط تغییر میده.و قسمت reduce ترکیب میکنه اون آرایه های تعداد کلماتو به [عدد |تعداد]،که تعداد نهایی در کل خطوط است.
شما برای پیاده سازی map/reduce در php آماده هستید؟
پیاده سازی map بسیار سادست و به ندرت احتیاج به توضیح دارد.تمام کاری که انجام میدیم فراخوانی تابع تغییر شکل برای هر عنصر ورودی و ذخیره هر نتیجه در آرایه ای که بازگشت داده خواهد شد.
<?php
/**
 * $transformer lambda(caterpillar) -> butterfly
 * $in array of caterpillars
 */
function map($transformer, $in) {
    $out = array();
    foreach($in as $item) {
        $out[] = $transformer($item);
    }
    return $out;
}
?>
به جزئیات توجه نکنید فقط تمرکز کنید به جایی که ما بیشتر از یک عنصر به تابع reduce میدهیم:
<?php
/**
 * $combiner lambda(butterfly, butterfly) -> butterfly
 * $in array of butterflies
 */
function reduce($combiner, $in, $identity) {
    if(count($in) <= 1) {
        $out = $identity;
    } else if(count($in) > 1) {
        $out = array_shift($in);
        do {
            $next = array_shift($in);
            $out = $combiner($out, $next);
        } while(!empty($in));
    }
    return $out;
}
$totals = reduce($sumWordCounts, map($lineToWordCounts, $lines), array());
var_export($totals);
// Output: array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, )
?>
با reduce ما شروع به شیفت دادن اولین پروانه از لیست میکنیم و ترکیب میکنیم اونهارو با پروانه ی بعدی برای ساختن یک ابر پروانه.و بعد ترکیب می کنیم اون ابر پروانه با لیست بعدی پروانه ها.تا زمانیکه ما یک پروانه داشته باشیم.
map/reduce نگاه ۲:پیاده سازی بازگشتی،لطفا
پیاده سازی اولیه map و reduce به صورت امرانه از حلقه ها استفاده می شد،مردمی که تابعی فکر میکنند عقیده دارند حلقه ها زباله اند و چرا ما باید از حلقه ها استفاده کنیم در جایی که تابع بازگشتی داریم؟map و reduce چطور به نظر میان وقتی حلقه ها رو حذف کنیم؟
قبل از اینکه این کارو انجام بدیم ،اجازه بدین چند تابع کمکی برای مقادیر بازگشتی بسازیم:
<?php
// First element of an array
function first($in) {
    return empty($in) ? null : $in[0];
}

// Everything after the first element of an array
function rest($in) {
    $out = $in;
    if(!empty($out)) { array_shift($out); }
    return $out;
}

// Take an element and an array
//  and fuse them together so that the element
//  is at the front of the array
function construct($first, $rest) {
    array_unshift($rest, $first);
    return $rest;
}
?>
حالا این توابع به ما کمک میکنند با آرایه ها مانند لیست ها کار کنیم:
<?php
/**
 * $transformer lambda(caterpillar) -> butterfly
 * $in array of caterpillars
 */
function map($transformer, $in) {
    return !empty($in) ?    construct(  $transformer(first($in)),
                                        map($transformer,rest($in)))
                        :    array();
};

/**
 * $combiner lambda(butterfly, butterfly) -> butterfly
 * $in array of butterflies
 */
function reduce($combiner, $in, $identity) {
    return !empty($in) ?    $combiner(first($in),
                                      reduce($combiner, rest($in), $identity))
                         :  $identity;
};

$totals = reduce($sumWordCounts, map($lineToWordCounts, $lines), array());
var_export($totals);
// Output: array ( 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, )
?>

phpتابعی – قسمت ۱ – Anonymous functions در php5.3

پنجشنبه, ۲۹ مرداد ۱۳۸۸

Anonymous functions

What are Anonymous Functions and Closures?

Anonymous function ها که با نام closure ها نیز شناخته میشن بهمون اجازه میده توابعی بدون نام بسازیم و اونها رو تو متغیر ها بریزیم یا به عنوان CallBack ازشون استفاده کنیم و حتی میشه از تابعی دیگه اونها رو بازگشت داد . البته فقط در php 5.3 .
اونهایی که از جاوا اسکریپت استفاده می کنن حتما بارها از توابع بدون نام استفاده کردن.

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// outputs helloWorld
?>
<?php
$lambda = function() {
            echo "I am an anonymous function,
                  aka a lambda!<br />";
            };//متغیر با یک تابع بی نام مقدار دهی میشه
$anonymousFunction = $lambda; //تابع بی نام به متغیر دیگه ای نیز اختصاص میدیم دقیقا مثل یک رشته
$anonymousFunction();
// Output: I am an anonymous function, aka a lambda!

function nCallsTo($n, $function) {
    for($i = 0; $i < $n; $i++) {
        $function();
    }
    return function() { echo "I am also an anonymous function!<br />"; };
    //یک تابع بی نام توسط تابعی دیگه بازگشت داده میشه
}

$anotherAnon = nCallsTo(3, $anonymousFunction);
// Output:
// I am an anonymous function, aka a lambda!
// I am an anonymous function, aka a lambda!
// I am an anonymous function, aka a lambda!

$anotherAnon();
// Output: I am also an anonymous function!
?>

توابع بی نام دست برنامه نویسهای php رو برای استفاده از high-order function باز میزاره.nCallsTo دقیقا یک تابع high-order است.این نوع توابع یک کار از ۲ کار زیر رو حتما باید انجام بدن:
۱)تابعی رو به عنوان ورودی گرفته ۲)یک تابع رو برگشت بدن

از این تکنیک (توابع high-order ) میشه دقیقا در داخل دستور map / reduce استفاده کرد.نکته اینه که lambda و توابع بی نام دقیقا یک چیز هستند :توابع می تونن [داخل | مقدار] یک متغیر باشند.

اگر توابع [ یک مقدار | مقدار یک متغیر ] باشند،php نوعشونو چی تشخیص میده؟

<?php
<?php
$lambda = function() { echo "anonymous function"; };
echo gettype($lambda) . '<br />';
// Output: object
echo get_class($lambda) . '<br />';
// Output: Closure
?>

تشخیص درخواست های ajax در php

جمعه, ۹ مرداد ۱۳۸۸

همیشه نوشتن صفحاتی که هم از URL و هم از طریق فانکشن کار کنه لذت بخشه.چون با چند خط اضافه کد نوشتن میتونیم از آپلود و ویرایش کردن صفحات مختلف جلوگیری کنیم.البته در بعضی از اوقات  صفحات فقط باید از طریق درخواست های ajax پاسخگو باشند،در این مواقع میتونیم برای دفع کنجکاوی های (حملات) نه چندان مهم از هدرها استفاده کرد.

[HTTP_X_REQUESTED_WITH] => XMLHttpRequest

if( isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
/* special ajax here */
}