پی‌اچ‌پی/نحوه توسعه پی‌اچ‌پی

ویکی‎کتاب، کتابخانهٔ آزاد
‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎
‎‏مقدمه‏‎‎‏نحوه توسعه پی‌اچ‌پی‏‎ ‎‎‏ساختار اولیه‏‎‎‏انواع داده‏‎‎‏متغیرها‏‎‎‏ثابت‌ها‏‎
‎‏بانک اطلاعاتی‏‎‎‏کار با پایگاه داده‏‎‎‏جلسه‌ها‏‎‎‏کار با فرم‌ها‏‎‎‏توابع‏‎‎‏کار با تاریخ و زمان‏‎

مقدمه[ویرایش]

در این مقاله به بررسی نحوه‌ی توسعه‌ی PHP می‌پردازیم. یکی از بزرگترین محاسن برنامه‌های open source از جمله PHP، باز بودن متن برنامه‌ی آنهاست که به توسعه‌دهندگان این امکان را می‌دهد تا برنامه‌ی مورد نظر را طبق درخواست‌ها و نیازهای خودشان تغییر داده و از آن استفاده کنند. پس از خواندن این مقاله شما خواهید توانست توسعه‌های ساده‌ای برای PHP نوشته و از آنها در پروژه‌های خود استفاده کنید. در این مقاله با هم توسعه‌ای ساده برای PHP خواهیم نوشت.

برای درک مطالب این مقاله احتیاج به داشتن اطلاعاتی در مورد زبان برنامه‌نویسی C و PHP و روش کامپایل کردن در لینوکس دارید. زبان برنامه‌نویسی این مقاله C بوده و محیط کاری لینوکس می باشد. پیش‌فرض آن است که شما توانایی نصب برنامه‌های مختلف تحت لینوکس را دارید. تمامی کارهای این مقاله تحت خط فرمان یا command line انجام می‌شود و شما باید تسلط و درک کافی در این مورد را نیز داشته باشید.

برنامه‌های مورد نیاز[ویرایش]

برای توسعه‌ی PHP احتیاج به نرم‌افزار‌هایی داریم که مسئولیت عملیات کامپایل کردن در لینوکس را دارند. لیستی از برنامه‌های مورد نیاز را در زیر می‌بینید، این نرم‌افزار ها را می‌توانید از آدرس /http://www.gnu.org گرفته و روی سیستم لینوکس‌تان نصب کنید. در صورتی که از توسعه‌های معروف لینوکس استفاده می‌کنید اکثر این برنامه‌ها را نصب شده دارید.

  • bison
  • flex
  • m4
  • autoconf
  • automake
  • libtool
  • gcc یا هر نوع کامپایلر دیگر
  • make
  • cvs از سایت /http://www.cvshome.org

پس از نصب برنامه های فوق، احتیاج دارید نسخه‌ی قابل توسعه‌ی PHP یعنی نسخه‌ی CVS یا Concurrent Version System آن را از آدرس http://cvs.php.net بگیرید و آماده‌ی توسعه شوید. برای این کار باید تحت خط فرمان لینوکس تان دستوری مشابه دستور زیر تایپ کرده و به جای X، Y و Z شماره‌ی نگارش PHP ای که قصد گرفتن آن را دارید را وارد کنید. با اجرای این دستور متن برنامه‌های PHP از اینترنت گرفته می‌شود و با شاخه‌ای به نام php-src روی دیسک سخت شما ذخیره می شود.

cvs -d :pserver:cvsread@cvs.php.net:/repository checkout -r php_X_Y_Z php-src

{{{2}}}

توسعه‌ی PHP[ویرایش]

هدف برنامه و آماده کردن محیط[ویرایش]

می‌خواهیم تابعی به PHP اضافه کنیم به شکل salam() که به عنوان ورودی یک رشته را دریافت کرده و رشته‌ای به صورت salam STRING را برگرداند.


به عنوان اولین قدم، به شاخه‌ی PHP رفته و سپس به شاخه‌ی ext آن می‌رویم و فایلی را در مورد نوع توابعی که قصد توسعه داریم می‌سازیم. در این فایل که ما نام آن را salam.def می‌گذاریم به ترتیب نوع خروجی توابع، نام تابع، نام و نوع پارامترهای ورودی، یک " " (فاصله) به عنوان جداکننده و رشته‌ای که توضیح مختصری از آن تابع باشد را می‌نویسیم. در این فایل، هر تابع را باید در یک خط بنویسیم. در زیر به نمونه فایل مورد نیاز برای توسعه‌ی تابع‌مان توجه می‌کنیم:

string salam(string arg) return "salam ARG"

{{{2}}} توجه کنید که تمامی مقادیر بعد از پرانتز بسته تا آخر خط، توضیحات تابع می‌باشند. PHP برنامه‌ای به نام ext_skel برای آماده‌سازی مقدمات توسعه دارد، که در شاخه‌ی ext قرار دارد و شما می‌توانید به عنوان دومین قدم توسعه، از آن استفاده کنید. برای ادامه‌ی توسعه احتیاج داریم از خط زیر استفاده کرده تا مجموعه‌س فایل‌های مورد نیاز توسط این برنامه ساخته شود.

./ext_skel –extname=salam –proto=salam.def

{{{2}}} با اجرای این دستور شاخه‌ای به نام مقدار جلوی –extname ساخته شده و فایل‌های مورد نیاز نیز در آن قرار می‌گیرد. این فایل‌ها عبارتند از:

  • config.m4
  • CREDITS
  • EXPERIMENTAL
  • salam.c
  • salam.php
  • Makefile.in
  • php_salam.h
  • شاخه‌ی tests

توسعه‌ی فایل‌ها[ویرایش]

یکی از مهم‌ترین و اصلی‌ترین فایل‌هایی که لازم است تغییر دهیم و تمامی کدهای اصلی برنامه‌ی ما در آن قرار دارد، فایل salam.c می‌باشد. با باز کردن این فایل، اولین قسمت مهمی که مشاهده می‌کنید، خطوط زیر می‌باشد:

/* {{{ salam_functions[]
every user-visible function must have an entry in salam_functions[]
*/
function_entry salam_functions[] = {
	PHP_FE(confirm_salam_compiled,  NULL)  /* for testing; remove later */
	PHP_FE(salam,   NULL)
	{NULL, NULL, NULL}  /* must be the last line in salam_functions[] */
};
/* }}} */

{{{2}}} این مقادیر توسط فایل salam.def که تعریف کرده بودیم ساخته شده و در صورتی که فایل salam.def را بدون نقص نوشته باشیم، احتیاجی به ایجاد تغییر در این قسمت نداریم. توجه کنید که اولین تابع معرفی شده یعنی confirm_salam_compiled یک تابع برای تست کامپایل شدن یا نشدن سری توابع‌مان بوده که پس از موفقیت در کامپایل، می‌توانیم خط مربوطه را حذف کنیم. کدهای مهم بعدی، مشابه بخش زیر خواهد بود که شامل توابع پیش‌فرض زمان فراخوانی و اتمام کار توابع مورد نظر می‌باشد. این بخش، اطلاعاتی در مورد نوع، نگارش و نام توسعه‌ی ما را نیز داراست.

zend_module_entry salam_module_entry = {
	STANDARD_MODULE_HEADER,
	"salam",
	salam_functions,
	PHP_MINIT(salam),
	PHP_MSHUTDOWN(salam),
	PHP_RINIT(salam), /* replace with NULL if no request init code */
	PHP_RSHUTDOWN(salam), /* replace with NULL if no request shutdown code */
	PHP_MINFO(salam),
	"0.1", /* replace with version number for your extension */
	STANDARD_MODULE_PROPERTIES
};

{{{2}}} برای تابعی که ما می‌خواهیم توسعه دهیم باید مقادیر PHP_RINIT(salam) و PHP_RSHUTDOWN(salam) را با NULL جایگزین کنیم، پس کد شما چیزی شبیه مقادیر زیر خواهد شد:

zend_module_entry salam_module_entry = {
	STANDARD_MODULE_HEADER,
	"salam",
	salam_functions,
	PHP_MINIT(salam),
	PHP_MSHUTDOWN(salam),
NULL,
NULL,
	PHP_MINFO(salam),
	"0.1", /* replace with version number for your extension */
	STANDARD_MODULE_PROPERTIES
};

{{{2}}} سپس توابع PHP_MINIT(salam)و PHP_MSHUTDOWN(salam) را پیدا کرده و تعیین می‌کنیم که مقدار SUCCESS را برگردانند. پس کد این بخش برنامه‌ی ما شبیه کد زیر می‌شود:

PHP_MINIT_FUNCTION(salam) {
     return SUCCESS;
 }
 PHP_MSHUTDOWN_FUNCTION(salam) {
     return SUCCESS;
}

{{{2}}} سپس به اصلی‌ترین تابع می‌رسیم که باید تمام وظایف مورد نظر برای تابع salam را در آن توسط زبان C نوشته تا خروجی مناسب را برای ما تولید کند. کدهای شما باید بعد از خط return بیاید و خط‌های بالای آن بدون تغییر بماند (این بدون تغییر ماندن به دلیل آگاهی نداشتن ما برای تغییر آنهاست. صحبت کامل در مورد این خطوط از حوصله‌ی این مقاله خارج بوده و فقط کافیست بدانید که این کدها شامل مراحل پردازش مقادیر ورودی تابع است).

/* {{{ proto string salam(string arg)
return "salam ARG" */
PHP_FUNCTION(salam)
{
	char *arg = NULL;
	int argc = ZEND_NUM_ARGS(  );
	int arg_len;
	if (zend_parse_parameters(argc TSRMLS_CC, "s", &arg, &arg_len)
		== FAILURE)
		return;
		// YOUR CODES SHOULD COME HERE
}
/* }}} */

{{{2}}} تابع PHP_FUNCTION برای PHP نام یک تابع را مشخص می‌کند و مقادیر داخل این تابع، اعمالی را که تابع PHP در هنگام فراخوانی آن در برنامه‌های PHP باید انجام دهد را نشان می‌دهد. همانطور که گفته شد، بعد از چند خط اول، کدهای ما قرار خواهد گرفت و برنامه‌ی ما به صورت زیر در خواهد آمد:

PHP_FUNCTION(salam) {
	char *arg = NULL, *sout;
	int argc = ZEND_NUM_ARGS();
	int arg_len, len; 
	
	if (zend_parse_parameters(argc TSRMLS_CC, "s/", &arg, &arg_len)
		== FAILURE)
		return;
	
	strcpy(sout, "salam ");
	strcat(sout, arg);
	len = strlen(sout);
	RETURN_STRINGL(sout, len, 1);
}

{{{2}}} ابتدا متغیرهایی به نام sout از نوع کاراکتر و len از نوع عددی تعریف کرده‌ایم. در خط بعد از return مقدار "salam " را در متغیر sout کپی کرده و سپس مقادیر sout و arg که رشته‌ی ورودی ما می باشد را به هم متصل می‌کنیم و به sout انتساب می‌دهیم. سپس طول sout را به دست آورده و از طریق تابع RETURN_STRINGL (این تابع جزو توابع ZEND API بوده و برای برگرداندن مقادیر استفاده می‌شوند، این توابع محدود و تعیین شده می‌باشند) مقدار رشته و طول آن را بر می‌گردانیم. سومین متغیر در تابع RETURN_STRINGL مشخص کننده‌ی صحت خروجی یا وجود اشکال در خروجی می‌باشد. هم اکنون توسعه تابع ما به پایان رسیده، اما برای امکان کامپایل تابع توسعه داده شده لازم است مقادیر لازم برای درست کامپایل شدن تابع را تصحیح و کامل کنیم. پس فایل salam.c را ذخیره کرده و می‌بندیم و فایل config.m4 را برای اِعمال تغییرات باز می‌کنیم. در این فایل، از قبل، خطوط لازم وجود دارند ولی به صورت توضیح یا comment در آمده‌اند که شما باید این خطوط را از این حالت خارج کنید. پس از این کار خطوطی دقیقا مشابه خطوط زیر خواهید داشت (توجه کنید که هیچ علامتی در ابتدای این خطوط نباشند):

PHP_ARG_ENABLE(salam, whether to enable salam support,
 [  --enable-salam           Enable salam support])

{{{2}}} توسعه‌ی تابع ما به پایان رسید، حال نوبت کامپایل کردن PHP است تا بتوانید از تابعی که نوشتیم در آن استفاده کنیم. در بخش بعد به این مساله می‌پردازیم.

کامپایل PHP[ویرایش]

قبل از اجرای دستورات کامپایل، برای اینکه PHP، توسعه‌ی جدید ما را بشناسد، لازم است دستور buildconf را که در شاخه‌ی اصلی PHP قرار دارد، اجرا کنیم. این دستور را باید به شکل زیر وارد کنیم:

./buildconf

{{{2}}} سپس باید برنامه را با توسعه‌ای که نوشتیم کامپایل کنیم. این کار در PHP شبیه خیلی از برنامه‌های دیگر تحت لینوکس انجام می‌شود. به این صورت که شما باید مقداری مشابه مقدار --enable-salam را در هنگام configure کردن PHP اِعمال کنید. سپس سری دستورات make را برای نصب PHP اجرا می‌کنیم. دستوراتی که اجرا می‌کنیم به ترتیب، شبیه دستورات زیر خواهد بود، توجه کنید که تمامی این دستورات باید در شاخه‌ی اصلی PHP اجرا شوند:

./configure --enable-salam
make
make install

{{{2}}} اکنون PHP شما با تابع شما توسعه پیدا کرده است. حال نوبت آزمایش تابع است تا مشاهده کنیم که درست کار می‌کند. برای این منظور فایلی با توسعه‌ی php و نام test ساخته و مقادیر زیر را در آن می‌نویسیم:

<?php
     echo salam('donya');
?>

{{{2}}} سپس، در خط فرمان دستور زیر را اجرا کنید. می‌بینید که مقدار "salam donya" در خروجی چاپ خواهد شد.

/usr/bin/php –q test.php

{{{2}}}

جمع بندی[ویرایش]

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

تابعی برای PHP ساختیم، که قبلا در آن وجود نداشت و از آن در برنامه‌ای که با PHP نوشتیم استفاده نمودیم.

به یاد داشته باشید که این مقاله، فقط توضیحات مختصری در مورد توسعه‌ی PHP نسخه ۴ ارایه کرده و قصد آشنا کردن شما با این مقوله را داشته است.