فست سی جی آی net/fastcgi
کارخواه فستسیجیآی: اجرای PHP یا هر برنامهی فستسیجیآی پشت یک سرور سلام.
واردسازی net.fastcgi
فستسیجیآی همان پروتکلی است که php-fpm و php-cgi -b میفهمند و این بسته یک کارخواه برای آن است. سرور وب در net/httpd برای تنظیم fastcgi_pass از همین بسته استفاده میکند؛ خودتان هم میتوانید مستقیم از آن استفاده کنید وقتی برنامهای باید یک درخواست را به یک اسکریپت PHP بسپارد.
یک درخواست فهرستی از متغیرهای CGI و یک بدنه است. NewParams فهرست را میسازد، Add آن را پر میکند، Connect اتصال TCP به پشتیبان باز میکند و Execute همه را میفرستد و منتظر پاسخ میماند. پاسخ وضعیت، همهی سرآیندها به همان ترتیبی که پشتیبان فرستاده و بدنه را بهصورت اشارهگر و طول نگه میدارد، پس تصویر یا فایل فشرده سالم برمیگردد.
// lang: en
package main
import net.fastcgi
import net.tcp
func main:
p := fastcgi.NewParams()
defer fastcgi.Free(p)
fastcgi.Add(p, "GATEWAY_INTERFACE", "CGI/1.1")
fastcgi.Add(p, "REQUEST_METHOD", "GET")
fastcgi.Add(p, "SCRIPT_NAME", "/index.php")
fastcgi.Add(p, "SCRIPT_FILENAME", "/srv/app/index.php")
fastcgi.Add(p, "QUERY_STRING", "a=1")
c := fastcgi.Connect("127.0.0.1", 9000, 5000)
if not tcp.ConnOk(c):
println "cannot reach the FastCGI backend"
ret 1
end
defer tcp.Close(c)
r := fastcgi.Execute(c, p, null, 0, 5000)
if not r.ok:
println "the request failed: ", r.error
ret 1
end
println r.status, " ", r.len, " bytes"
fastcgi.FreeResponse(r)
ret 0
end
هر اتصال یک درخواست را میبرد، که همان چیزی است که php-fpm از یک جلوی ساده انتظار دارد. زمانسنج به میلیثانیه است و کل تبادل را در بر میگیرد، از اتصال هم؛ صفر یعنی ۳۰ ثانیه. پشتیبانی که اتصال را زود ببندد، پاسخی که بلوک سرآیند نداشته باشد یا خطای پروتکل بهصورت ok = false و پیام در error برمیگردد، نه بهصورت از کار افتادن برنامه.
چیزهایی که مردم اشتباه میکنند:
Executeبدنه را بهصورت اشارهگر و طول میگیرد. وقتی بدنهای نیستnullو0بدهید؛ رشتهی خالی اشارهگر نیست.Addنام و مقدار را کپی میکند، پس رشتهی موقت را میتوانید بلافاصله بعد ازAddآزاد کنید وFreeهمهی کپیها را آزاد میکند.- بدنهی پاسخ متعلق به پاسخ است: وقتی کارتان تمام شد
FreeResponseرا صدا بزنید، وگرنه بافر آزاد نمیشود. - نشانی TCP است. php-fpm باید روی یک درگاه مثل
127.0.0.1:9000گوش بدهد، نه روی سوکت یونیکس، و پر کردن متغیرهای CGI با شماست: پشتیبان دستکم بهSCRIPT_FILENAMEوREQUEST_METHODنیاز دارد تا پاسخ بدهد. - خروجی خطای پشتیبان خطا نیست. یک اخطار PHP روی stderr درخواست را خراب نمیکند؛ فقط پاسخ شکسته یا نبودِ پاسخ این کار را میکند.
گونهها
پارامتر Param
ساختار پارامترREQUEST_METHOD و مقدارش.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نام | name | رشته = "" | نام متغیر، همانطور که PHP از $_SERVER میخواند. |
| مقدار | value | رشته = "" | مقدار متغیر. |
واردسازی شبکه.فست سی جی آی
تابع ریشه:
p := فست سی جی آی.پارامترهای جدید()
دیرکن فست سی جی آی.آزادسازی(p)
فست سی جی آی.افزودن(p، "REQUEST_METHOD"، "GET")
فست سی جی آی.افزودن(p، "SCRIPT_NAME"، "/index.php")
هر item در p.آیتم ها:
سرچاپ item.نام + "=" + item.مقدار
پایان
پایانپارامترها Params
ساختار پارامترهاAdd به آن میافزاید و Free آزادش میکند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| آیتم ها | items | وکتور<پارامتر> | متغیرها، به ترتیبی که افزوده شدهاند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Params.salam
سرصفحه Header
ساختار سرصفحهSet-Cookie میرسد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نام | name | رشته = "" | نام سرآیند. |
| مقدار | value | رشته = "" | مقدار سرآیند، بدون نام و دونقطه. |
واردسازی شبکه.فست سی جی آی
واردسازی شبکه.تی سی پی
تابع ریشه:
p := فست سی جی آی.پارامترهای جدید()
دیرکن فست سی جی آی.آزادسازی(p)
فست سی جی آی.افزودن(p، "REQUEST_METHOD"، "GET")
فست سی جی آی.افزودن(p، "SCRIPT_NAME"، "/index.php")
فست سی جی آی.افزودن(p، "SCRIPT_FILENAME"، "/srv/app/index.php")
c := فست سی جی آی.اتصال("127.0.0.1"، 9000، 1000)
اگر وارونه تی سی پی.اتصال معتبر(c):
سرچاپ "no FastCGI backend on 127.0.0.1:9000"
برگشت 1
پایان
دیرکن تی سی پی.بستن(c)
r := فست سی جی آی.اجرا(c، p، پوچ، 0، 5000)
اگر وارونه r.موفق:
سرچاپ r.خطا
برگشت 1
پایان
سرچاپ r.وضعیت، r.اندازه
فست سی جی آی.آزادسازی پاسخ(r)
برگشت 0
پایانپاسخ Response
ساختار پاسخ| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| وضعیت | status | صحیح = 0 | وضعیت HTTP از خط Status:، یا ۲۰۰ وقتی پشتیبان چنین خطی نمیفرستد. |
| سرصفحه ها | headers | وکتور<سرصفحه> | سرآیندها به ترتیبی که پشتیبان فرستاده، بدون Status. |
| بدنه | body | تهی* | بایتهای بدنه که متعلق به پاسخاند. وقتی کارتان تمام شد به FreeResponse بدهید. |
| اندازه | len | صحیح = 0 | تعداد بایتهای بدنه؛ صفر وقتی بدنه خالی است و body تهی است. |
| موفق | ok | منطقی = نادرست | درست وقتی پاسخی کامل خوانده شد، هر وضعیتی که داشته باشد. ۴۰۴ از PHP هم ok است. |
| خطا | error | رشته = "" | دلیل شکست درخواست وقتی ok نادرست است: نبود اتصال، پاسخ نیمهکاره، خطای پروتکل، یا متن stderr وقتی بلوک سرآیند نرسیده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Connect.salam
تابعها
پارامترهای جدید NewParams
تابع پارامترهای جدید(): پارامترهانمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Params.salam
افزودن Add
تابع افزودن(p &: پارامترها، name: رشته، value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Params.salam
آزادسازی Free
تابع آزادسازی(p &: پارامترها)نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Params.salam
اتصال Connect
تابع اتصال(host: رشته، port: صحیح، timeout_ms: صحیح): tcp.Conntcp.ConnOk بررسیاش کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Connect.salam
اجرا Execute
تابع اجرا(c: tcp.Conn، params: پارامترها، data: تهی*، n: صحیح، timeout_ms: صحیح): پاسخFreeResponse آزاد کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Connect.salam
آزادسازی پاسخ FreeResponse
تابع آزادسازی پاسخ(r &: پاسخ)نمونهی این مورد همراه با موارد بالاتر آمده است: net-fastcgi-Connect.salam