راهنمای نصب php بر روی سرور
۷ بهمن ۱۳۸۸چند روز قبل در سایت رسمی php راهنمای کاملی برای نصب php بر روی سرورهای یونیکس ، ویندوز و Mac OS X با وب سرورهای لایتی و آپاچی نسخه ۱ و ۲ و IIS نسخه ۵ و ۶ و ۷ و نصب اکستنشن های PECL و …
چند روز قبل در سایت رسمی php راهنمای کاملی برای نصب php بر روی سرورهای یونیکس ، ویندوز و Mac OS X با وب سرورهای لایتی و آپاچی نسخه ۱ و ۲ و IIS نسخه ۵ و ۶ و ۷ و نصب اکستنشن های PECL و …
در برنامه هایی که با تکنولوژی ای جکس نوشته میشن استفاده از Json به خاطر حجم کم و … (دلایل دیگه ای که من نمیدونم) امری بدیهی شده. بعضی از مواقع باید آبجکت به رشته و یا رشته به آبجکت تبدیل گردد. دو تابع مفید در دوجو:
dojo.toJson : ورودی این تابع ، آبجکت است و رشته ای Json را به عنوان خروجی ارسال می کند.
// a simple object
var obj = { a:"one", b:3, c:true };
// convert it to a string:
var data = dojo.toJson(obj);
console.log(data, typeof data);
>>> {"a":"one","b":3,"c":true} string
dojo.fromJson: وروردی تابع ،رشته است و آبجکتی را به عنوان خروجی ارسال می کند.
var json = '{"a":"one","b":3,"c":true}';
var obj = dojo.fromJson(json);
console.log(obj.a, obj.b, obj.c);
>>> one 3 true
dojo.objectToQuery: همونطور که در مثال می بینید این تایع آبجکتی را به عنوان ورودی گرفته و آن را تبدیل به کوئری کرده و به خروجی می دهد.
(کوئری رشته ای است که در موقع ارسال فرم با تکنیک GET در مرورگر دیده میشود)
var uri = "http://some.server.org/somecontext/";
var query = {
foo: ["bar", "baz"],
bit: "byte"
};
//Assemble the new uri with its query string attached.
var queryStr = dojo.objectToQuery(query);
uri = uri + "?" + queryStr;
//The uri should look like:
// http://some.server.org/somecontext/?foo=bar&foo=bar2&bit=byte
و تابع dojo.queryToObject که دقیقا برعکس بالا عمل میکند:
var uri = "http://some.server.org/somecontext/?foo=bar&foo=bar2&bit=byte";
var query = uri.substring(uri.indexOf("?") + 1, uri.length);
var queryObject = dojo.queryToObject(query);
//The structure of queryObject will be:
// {
// foo: ["bar", "bar2],
// bit: "byte"
// }
و توابع دیگری مانند formToJson و formToQuery [که قبلا توضیح دادم]
و اگر به بحث Object references در Json علاقه دارید باید از اکستنشن dojox.json.ref استفاده کنید.
میتونم بگم دوجو مفیدترین چیزی که من تو طراحی وب یاد گرفتم.این اصلا مهم نیست ، مهم اینه بعد از چند ماه انتظار ورژن ۱٫۴ این ابزار منتشر شد.
Dojo 1.4 is hot off the presses, with more than seven months of significant improvements to performance, stability, and features.
Of particular interest:
IO Pipeline topics
dojo.cache
dojo.contentHandlers
dojo.hash with native HTML5 onhashchange event support where available
Traversal and manipulation for NodeLists (the return value for dojo.query)
dojo.ready (easier to type than dojo.addOnLoad)
Hundreds of refinements to the Dijit API and collection of Dijits, and a few new widgets in DojoX
DataChart widget and other improvements to charting
dojox.drawing lands!
Editor improvements and new plug-ins in both Dijit and DojoX
Grid is faster, and the EnhancedGrid lands!
ForestStoreModel for the TreeGrid
GFX improvements
dojox.jq, a very experimental module aimed at trying to match the jQuery API as close as possible, but using Dojo underneath
Dojo build system optionally supports the Google Closure Tools compiler
Significant speed improvements, especially in IE
Read the full Dojo 1.4 release notes for more details! And thanks to everyone in the Dojo community that helped make this release great!
PHP Filters and How to Use Them
اگر شما هر اسکریپت 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 ها به طور معمول سخت است،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 خصوصی و رزو شده می باشد.
تمیز کاری داده ها به آسانی اعتبار سنجی آنهاست.به خاطر داشته باشید که تمیز کاری و اعتبار سنجی ، با هم تفاوت دارند چون در تمیز کاری ما کاراکترهای غیر دلخواه را حذف کرده و داده معتبر جدیدی را بر می گردانیم.حالا نگاهی به تمیزکاری یک رشته می کنیم.
$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
شاید یکی از بهترین چیزها در مورد تابع 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
flatpress وبلاگی اپن سورس هست که روی php4 به بعد بدون احتیاج به mysql بدرستی کار میکند.بله بدون احتیاج به mysql!!
این سیستم تمام اطلاعات وبلاگ در فایل های txt ذخیره می کند،مسیر ذخیره اطلاعات طبق محتویات فایل flatpress\docs\spb_db.txt به صورت زیر هست:
- SimplePHPBlog flat "db" structure
[$content][flatpress\fp-content\content]
|
|-- [$year] // two-digit year ID (05 stands for 2005)
| |
| |-- [$month] //two-digit month ID (01 stands for January)
| |
| |-- entryYYMMDD-HHMMSS.txt
| |-- [entryYYMMDD-HHMMSS]
| |
| |-- rating.txt
| |-- view_counter.txt
| |-- [comments]
| |
| |-- commentYYMMDD-HHMMSS.txt
|
|-- [static]
|
|-- $filename.txt
فلت پرس پلاگین ها را پشتیبانی و برای تم از smarty استفاده می کند و سیستم ابزارک (Widget) نیز دارد .
منبع: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: <-- yourrootsqlpassword Repeat password for the MySQL "root" user: <-- yourrootsqlpassword
۳٫نصب آپاچی۲
آپاچی۲ در بسته اوبونتو وجود داره و با این دستور نصب میشه:
aptitude install apache2
حالابه آدرس http://127.0.0.1 برید و صفحه یپش فرض سرور (It works!) باید ببینید.

مسیر پیش فرض ریشه وب سرور
/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 بریم:

همونطور که میبینیم 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 هم اونجاست:

phpmyadmin یک رابط گرافیکی تحت وب هست برای مدیریت بانک اطلاعاتی mysql:
aptitude install phpmyadmin
شما سوالای زیرو به این صورت جواب بدید:
Web server to reconfigure automatically: <-- apache2 Configure database for phpmyadmin with dbconfig-common? <-- No
حالا در آدرس http://127.0.0.1/phpmyadmin شما به phpmyadmin دسترسی دارید.

منبع: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();
?>
VirtualBox یک نرم افزار برای مجازی سازی که به خوبی سیستم عامل های مختلف رو کنار هم (همزمان) قابل اجرا می کنه،من تا چند وقت پیش از نسخه ۱٫۵٫۶ استفاده می کردم که بعد از دانلود نسخه ۳ و اجرا این ارور میداد:
“An old innotek VirtualBox installation has been found on this machine. Please uninstall this package first and then install Sun xVM VirtualBox!”
و چون این نسخه uninstaller نداشت مجبور به حذف دستی فایل ها شدم که باز هم تاثیر نداشت ، با یه جستجو کوچیک به این تاپیک برخورد کردم که راه حل این مشکل حذف این آدرس از رجیستری [HKEY_LOCAL_MACHINE\SOFTWARE\Innotek\VirtualBox] و reset کردن عنوان کرده بود ، که به نصب موفقیت آمیز نسخه جدید منجر شد.
چند روز پیش دیوید والش تو مطلبی با عنوان Remove Broken Images Using MooTools or jQuery نحوه حذف عکس های لود نشده با جی کوئری و موتولز نوشته که منم راغب شدم با دوجو اون تکه کد بازنویسی کنم.
البته طبق معمول IE از این event پشتیبانی نمیکنه.
dojo.addOnLoad(function(){
dojo.query("img").connect("onerror", function(evt){
dojo.destroy(evt.target);
});
});
api.dojotoolkit - docs.dojocampus
dojo.hitch(foo, "bar")(); //runs foo.bar() in the scope of foo dojo.hitch(foo, myFunction); //returns a function that runs myFunction in the scope of foo
somFunction(somObject.someMethod)
و نتیجه هم نمی گیرن ، dojo.hitch این مشکل حل کرده
var theAccumulator= {
total: 0,
clear: function() {
this.total= 0;
},
add: function(x) {
this.total+= x;
},
getResult: function() {
return this.total;
}
};
theAccumulator.clear(); theAccumulator.add(100); theAccumulator.add(200); printResult(theAccumulator.getResult);
printResult(function(){return theAccumulator.getResult();});
printResult(dojo.hitch(theAccumulator, "getResult" ));