สร้างแอพพลิเคชั่นที่มีน้ำหนักเบาและติดตั้งที่เขียนใน HTML, CSS, JavaScript และ PHP สำหรับระบบปฏิบัติการ Windows, Mac และ Linux

สิ่งที่สามารถสร้างได้ด้วยเซิร์ฟเวอร์แอพ PHP เป็นแอพพลิเคชั่นซอฟต์แวร์ที่ติดตั้งได้ซึ่งใช้เวลาส่วนหนึ่งในการสร้างเมื่อเปรียบเทียบกับการพัฒนาแอปพลิเคชันเดสก์ท็อปแบบดั้งเดิม ไปจากแนวคิด/แนวคิดไปสู่การปรับใช้อย่างเต็มรูปแบบใน 1/10th เวลาและสนับสนุนระบบปฏิบัติการเดสก์ท็อปที่สำคัญทุกแห่งด้วยฐานรหัสเดียว

PHP App Server เป็นเว็บเซิร์ฟเวอร์ที่มีคุณสมบัติครบถ้วนและขยายได้ใน PHP พร้อมคุณสมบัติที่กำหนดเองที่ออกแบบมาเป็นพิเศษเพื่อใช้ในสภาพแวดล้อม Desktop OS แบบดั้งเดิม เมื่อผู้ใช้รันซอฟต์แวร์ผ่านเมนูเริ่มต้นแอปพลิเคชันตัวเรียกใช้ ฯลฯ ซอฟต์แวร์จะเริ่มเซิร์ฟเวอร์แล้วเรียกใช้เว็บเบราว์เซอร์ที่ผู้ใช้ต้องการเพื่อเข้าถึงแอปพลิเคชัน PHP ให้อำนาจแบ็คเอนด์ในขณะที่เว็บเบราว์เซอร์จัดการรายละเอียดทั้งหมดของการแสดงส่วนต่อประสานผู้ใช้ สคริปต์ตัวติดตั้งแบบสำเร็จรูปทำให้กระบวนการสร้างแพ็คเกจรีลีสสุดท้ายง่ายขึ้นสำหรับการจัดส่งไปยังระบบคอมพิวเตอร์ของผู้ใช้ของคุณ
ดาวน์โหลดหรือโคลนการเปิดตัวซอฟต์แวร์ล่าสุด เมื่อโคลนนิ่งอย่าลืมใช้ส้อมและสร้างสาขาสำหรับแอปของคุณก่อนที่จะเริ่มการพัฒนา การทำเช่นนั้นหลีกเลี่ยงการเขียนทับซอฟต์แวร์ของคุณโดยไม่ตั้งใจเมื่อใดก็ตามที่คุณดึงข้อมูลอัปเดตต้นน้ำสำหรับเซิร์ฟเวอร์แอพ PHP
สำหรับคู่มือที่เหลือนี้จะมีการติดตั้ง PHP เวอร์ชันล่าสุด มีหลายวิธีที่จะทำให้สิ่งนั้นเกิดขึ้น
จากบรรทัดคำสั่งรันต่อไปนี้เพื่อรับรายการตัวเลือกบรรทัดคำสั่ง:
php server.php -?
เริ่มต้นเว็บเซิร์ฟเวอร์บนพอร์ต 9002 โดยเรียกใช้:
php server.php -port=9002
โครงสร้างไดเรกทอรีของเซิร์ฟเวอร์แอพ PHP มีดังนี้:
server.php เพื่อใช้งาน สร้างไฟล์ index.php ในไดเรกทอรี 'www':
<?php
phpinfo ();เชื่อมต่อกับเซิร์ฟเวอร์ที่ทำงานด้วยเว็บเบราว์เซอร์ของคุณที่:
http://127.0.0.1:9002/
ผลลัพธ์ของ phpinfo() จะแสดงในเบราว์เซอร์และผลลัพธ์ของคำขอถูกเขียนไปยังบรรทัดคำสั่ง
เปลี่ยน URL เป็น:
http://127.0.0.1:9002/api/v1/account/info
ไฟล์ index.php เดียวกันทำงาน
เปลี่ยนชื่อหรือคัดลอกไฟล์ index.php ไปยัง api.php และโหลดหน้าใหม่ ตอนนี้ api.php กำลังถูกเรียก คุณสมบัติไดเรกทอรีเสมือนจริงของเซิร์ฟเวอร์แอพ PHP เป็นสิ่งที่คุณอาจพบว่ามีประโยชน์เมื่อคุณพัฒนาแอปพลิเคชันของคุณ
แอปพลิเคชันซอฟต์แวร์ที่ติดตั้งไม่สามารถเขียนถึง 'www' ได้ แอปพลิเคชันมักจะติดตั้งโดยผู้ใช้ที่ได้รับการยกเว้นในระบบ แต่บุคคลที่ใช้งานซอฟต์แวร์โดยทั่วไปจะไม่มีสิทธิ์เพียงพอที่จะเขียนลงในไดเรกทอรี 'www' นี่คือการพิจารณาที่สำคัญที่ต้องคำนึงถึงในขณะที่พัฒนาแอปพลิเคชันซอฟต์แวร์โดยใช้ PHP App Server โชคดีที่มีวิธีแก้ปัญหานี้ที่สร้างขึ้นในเซิร์ฟเวอร์: รากเอกสารคู่
เมื่อรหัส PHP กำลังดำเนินการจากไดเรกทอรี 'www' ของแอปพลิเคชันมันสามารถเข้าถึงตัวแปร $_SERVER ห้าตัวที่ผ่านเข้ามาและไม่ซ้ำกับสภาพแวดล้อมเซิร์ฟเวอร์แอพ PHP:
DOCUMENT_ROOT_USER สามารถเขียนถึง แต่ไม่สามารถอ้างอิงได้โดย URL มีประโยชน์สำหรับการจัดเก็บข้อมูลส่วนตัวสำหรับแอปพลิเคชัน (เช่นฐานข้อมูล SQLite)server.php อยู่) มีประโยชน์สำหรับการเข้าถึงไฟล์ในไดเรกทอรี support เมื่อมีการร้องขอไปยังเว็บเซิร์ฟเวอร์เซิร์ฟเวอร์แอพ PHP จะดูไฟล์ในไดเรกทอรี 'www' ของแอปพลิเคชันก่อน หากไม่พบไฟล์ที่นั่นให้ตรวจสอบไฟล์ในเส้นทางที่ระบุโดย DOCUMENT_ROOT_USER
การเขียนแอปพลิเคชันเซิร์ฟเวอร์ LocalHost ที่อาศัยเว็บเบราว์เซอร์อาจส่งผลให้เกิดการละเมิดความปลอดภัยของระบบอย่างรุนแรงตั้งแต่การสูญเสียการควบคุมข้อมูลไปจนถึงการทำลายระบบไฟล์ของผู้ใช้ ตราบใดที่แอปพลิเคชันถูกเขียนอย่างถูกต้องนโยบายของเว็บเบราว์เซอร์มักจะปกป้องผู้ใช้จากเว็บไซต์ที่เป็นอันตรายและผู้ใช้ที่พยายามเข้าถึงเนื้อหาที่ควบคุมเซิร์ฟเวอร์แอพ PHP
อย่างไรก็ตามนี่คือรายการที่สำคัญบางอย่างเลือกรายการที่เกี่ยวข้องกับความปลอดภัยที่แอปพลิเคชันซอฟต์แวร์เซิร์ฟเวอร์ PHP ทั้งหมดจะต้องป้องกันอย่างแข็งขัน (ตามลำดับความสำคัญ):
$_SERVER["PAS_USER_FILES"] หรือตำแหน่งที่ผู้ใช้กำหนดไว้เพื่อจัดเก็บข้อมูลผู้ใช้ที่ละเอียดอ่อนแทน $_SERVER["DOCUMENT_ROOT_USER"] ถามผู้ใช้เสมอว่าจะทำอย่างไรถ้าพวกเขาอาจพิจารณาบางสิ่งที่ละเอียดอ่อน (เช่นการถามอาจง่ายพอ ๆ กับการแสดงช่องทำเครื่องหมายให้กับผู้ใช้) โดยทั่วไปแล้วบุคคลที่เน้นความเป็นส่วนตัวจะพูดจิตใจของพวกเขา$_SERVER["PAS_SECRET"] รวมกับ Cubiclesoft Admin Pack หรือเฟรมเวิร์กแอปพลิเคชันอื่น ๆ ช่วยจัดการปัญหานี้ ส่วนขยายของเซิร์ฟเวอร์ยังต้องใช้โทเค็นการตรวจสอบสิทธิ์ตาม $_SERVER["PAS_SECRET"]มีข้อควรพิจารณาด้านความปลอดภัยอื่น ๆ อีกมากมายที่อยู่ในรายการ OWASP TOP 10 และรายการ OWASP Attacks ที่จะต้องคำนึงถึง แต่สิ่งเหล่านี้เป็นสิ่งที่ยิ่งใหญ่
เซิร์ฟเวอร์แอพ PHP รวมถึงส่วนขยายเซิร์ฟเวอร์ที่ทรงพลังและ SDK สองตัวเพื่อเริ่มต้นการจัดการและการตรวจสอบกระบวนการที่ดำเนินมานานง่ายและปลอดภัยจากทั้ง PHP และ JavaScript กระบวนการเริ่มต้นทำงานเป็นผู้ใช้ที่เซิร์ฟเวอร์แอพ PHP กำลังทำงานอยู่ แต่ไม่ จำกัด โดยการกำหนดเวลาหรือขีด จำกัด ของหน่วยความจำเช่นคำขอ CGI/FastCGI ปกติ กระบวนการรันสามารถตรวจสอบอย่างแข็งขันและแม้กระทั่งโต้ตอบกับจากเว็บเบราว์เซอร์ผ่าน JavaScript SDK ที่ให้มา

สคริปต์ที่ดำเนินการมานานควรจะถูกเก็บไว้ในไดเรกทอรีย่อย 'สคริปต์' นอกไดเรกทอรีการสนับสนุนเซิร์ฟเวอร์ PHP Main Server ' ด้วยวิธีนี้พวกเขาอยู่ห่างจากรูทเว็บหลัก แต่แอปพลิเคชันยังสามารถค้นหาได้ผ่าน $_SERVER["PAS_ROOT"]
นี่คือตัวอย่างของการเริ่มต้นสคริปต์ PHP ที่เรียกว่า 'test.php' โดยใช้ PHP SDK:
<?php
$ rootpath = str_replace ( "\" , " / " , dirname ( __FILE__ ));
// Load the PHP App Server common functions.
require_once $ _SERVER [ " PAS_ROOT " ] . " /support/process_helper.php " ;
require_once $ _SERVER [ " PAS_ROOT " ] . " /support/pas_functions.php " ;
$ cmd = escapeshellarg ( PAS_GetPHPBinary ());
$ cmd .= " " . escapeshellarg ( realpath ( $ _SERVER [ " PAS_ROOT " ] . " /support/scripts/test.php " ));
$ options = array (
// "rules" => array(
// "start" => time() + 5,
// "maxqueued" => 3
// ),
// "stdin" => false,
// "dir" => $_SERVER["PAS_ROOT"] . "/support/scripts/",
// "env" => ProcessHelper::GetCleanEnvironment(),
// "extraenv" => array("PASSWORD" => "supersecret"),
// "extra" => array(
// "title" => "Custom window title",
// "inputmode" => "readline"
// )
);
// Start the process.
require_once $ rootpath . " /support/pas_run_process_sdk.php " ;
$ rp = new PAS_RunProcessSDK ();
$ result = $ rp -> StartProcess ( " demo " , $ cmd , $ options );
if (! $ result [ " success " ]) echo " An error occurred while starting a long-running process. " ;
echo " Done. " ;
?>แต่ละกระบวนการจะได้รับแท็กซึ่งช่วยให้กระบวนการรันหลายกระบวนการถูกจัดกลุ่มตามแท็ก ในตัวอย่างด้านบนแท็กเรียกว่า "สาธิต" Javacsript SDK สามารถใช้ในภายหลังเพื่อแสดงเฉพาะกระบวนการที่ใช้แท็กเฉพาะ:
<?php
header ( " Content-Type: text/html; charset=UTF8 " );
?>
<!DOCTYPE html>
<html>
<body>
<?php
$ rootpath = str_replace ( "\" , " / " , dirname ( __FILE__ ));
require_once $ rootpath . " /support/pas_run_process_sdk.php " ;
PAS_RunProcessSDK:: OutputCSS ();
PAS_RunProcessSDK:: OutputJS ();
?>
<div id="terminal-manager"></div>
<script type="text/javascript">
// NOTE: Always put Javascript RunProcesSDK and TerminalManager class instances in a Javascript closure like this one to limit the XSRF attack surface.
(function() {
// Establish a new connection with a compatible WebSocket server.
var runproc = new RunProcessSDK(' <?= PAS_RunProcessSDK:: GetURL () ?> ', false, ' <?= PAS_RunProcessSDK:: GetAuthToken () ?> ');
// Debugging mode dumps incoming and outgoing packets to the web browser's debug console.
runproc.debug = true;
// Establish a new terminal manager instance.
var elem = document.getElementById('terminal-manager');
// Automatically attach to all channels with the 'demo' tag.
var options = {
tag: 'demo'
};
var tm = new TerminalManager(runproc, elem, options);
})();
</script>
</body>
</html>PHP SDK ช่วยลดความซับซ้อนของการพึ่งพา CSS และ Javscript ที่จำเป็นใน HTML รหัสด้านบนแสดงให้เห็นถึงการตั้งค่าการเชื่อมต่อ WebSocket ไปยังส่วนขยายเซิร์ฟเวอร์แอพ PHP และเชื่อมต่อกับอินสแตนซ์ TerminalManager เพื่อตรวจสอบกระบวนการด้วยแท็ก "สาธิต" TerminalManager เป็นคลาส JavaScript ที่รวมอยู่ซึ่งสร้างและจัดการ execterminals หนึ่งรายการขึ้นไป (รวมอยู่ด้วย) โดยอัตโนมัติตามเกณฑ์การป้อนข้อมูล ในกรณีนี้ TerminalManager จะแนบกับกระบวนการใด ๆ ที่สร้างขึ้นด้วยแท็ก "สาธิต" โดยอัตโนมัติ execterminal มีลักษณะเช่นนี้:

Execterminal แต่ละตัวจะปิดอินสแตนซ์ของเทอร์มินัล XTERM.JS พร้อมคุณสมบัติเพิ่มเติม:
และอื่น ๆ
โปรดทราบว่า TerminalManager และ Execterminal ไม่จำเป็นสำหรับการจัดการกระบวนการที่ดำเนินมานาน แต่พวกเขาจัดการกับสถานการณ์ทั่วไปไม่กี่สถานการณ์ รหัสตัวอย่างด้านบนมีรอยขีดข่วนพื้นผิวของสิ่งที่สามารถทำได้
นี่คือรายการเต็มของตัวเลือก TerminalManager:
คลาส XTERM PHP ที่รวมอยู่นั้นให้การควบคุมที่ราบรื่นและเรียบง่ายเหนือเอาท์พุทจากสคริปต์ที่ดำเนินมายาวนานไปยัง Execterminal ที่เข้ากันได้กับ XTERM ในเบราว์เซอร์ ไม่จำเป็นต้องจำรหัสหลบหนีของ ANSI นี่คือตัวอย่างสคริปต์:
<?php
if (! isset ( $ _SERVER [ " argc " ]) || ! $ _SERVER [ " argc " ])
{
echo " This file is intended to be run from the command-line. " ;
exit ();
}
$ rootpath = str_replace ( "\" , " / " , dirname ( __FILE__ ));
require_once $ rootpath . " /../xterm.php " ;
for ( $ x = 0 ; $ x < 5 ; $ x ++)
{
echo " Test: " . ( $ x + 1 ) . "n" ;
sleep ( 1 );
}
echo " That's boring. Let's... " ;
sleep ( 1 );
XTerm:: SetItalic ();
echo " spice it up! n" ;
XTerm:: SetItalic ( false );
sleep ( 1 );
$ palette = XTerm:: GetBlackOptimizedColorPalette ();
for ( $ x = 5 ; $ x < 10 ; $ x ++)
{
$ num = mt_rand ( 17 , 231 );
XTerm:: SetForegroundColor ( $ palette [ $ num ]);
echo " Test: " . ( $ x + 1 ) . " (Color " . $ palette [ $ num ] . " ) n" ;
sleep ( 1 );
}
XTerm:: SetForegroundColor ( false );
XTerm:: SetTitle ( " Changing the title... " );
usleep ( 250000 );
XTerm:: SetTitle ( " Changing the title...like " );
usleep ( 250000 );
XTerm:: SetTitle ( " Changing the title...like a " );
usleep ( 250000 );
XTerm:: SetTitle ( " Changing the title...like a BOSS! " );
usleep ( 500000 );
echo "n" ;
echo " Enter some text: " ;
$ line = rtrim ( fgets ( STDIN ));
XTerm:: SetBold ();
echo " Here's what you wrote: " . $ line . "nn" ;
XTerm:: SetBold ( false );
echo " [Switching to 'readline_secure' mode] nn" ;
XTerm:: SetCustomInputMode ( ' readline_secure ' );
echo " Enter some more text: " ;
XTerm:: SetColors ( 0 , 0 );
$ line = rtrim ( fgets ( STDIN ));
XTerm:: SetColors ( false , false );
XTerm:: SetCustomInputMode ( ' readline ' );
XTerm:: SetBold ();
echo " Here's what you wrote: " . $ line . "nn" ;
XTerm:: SetBold ( false );
echo " Done. n" ;
?>สุดท้ายหากคุณใช้ Cubiclesoft Admin Pack หรือ Flexforms เพื่อสร้างแอปพลิเคชันของคุณ PHP SDK จะรวมการรวม Flexforms ดั้งเดิม (เช่นไม่จำเป็นต้องเขียน JavaScript/HTML):
<?php
// Admin Pack and FlexForms integration.
require_once " support/pas_run_process_sdk.php " ;
$ contentopts = array (
" desc " => " Showing all long-running processes with the 'demo' tag. " ,
" fields " => array (
array (
" type " => " pas_run_process " ,
// "debug" => true,
" options " => array (
" tag " => " demo "
)
)
)
);
BB_GeneratePage ( " Process Demo " , $ menuopts , $ contentopts );
?> การเขียนส่วนขยายต้องใช้ความรู้เล็กน้อยเกี่ยวกับวิธีการทำงานของเซิร์ฟเวอร์แอพพลิเคชั่น PHP: ส่วนขยายจะถูกโหลดเร็วในระหว่างการเริ่มต้นเพื่อให้พวกเขาสามารถมีส่วนร่วมในลำดับการเริ่มต้นหากพวกเขาต้องการ (ส่วนใหญ่เป็นเพียงส่วนขยายที่เกี่ยวข้องกับความปลอดภัย) เมื่อเว็บเซิร์ฟเวอร์เริ่มต้นขึ้นทุกคำขอเว็บจะเดินผ่านรายการส่วนขยายและถามว่า "คุณสามารถจัดการคำขอนี้ได้หรือไม่" หากส่วนขยายตอบกลับในการยืนยัน (เช่นส่งคืนจริง) จากนั้นส่วนที่เหลือของคำขอจะถูกส่งไปยังส่วนขยายเพื่อจัดการ
เนื่องจากส่วนขยายจะทำงานโดยตรงกับเซิร์ฟเวอร์หลักพวกเขาจะได้รับการเพิ่มประสิทธิภาพที่สำคัญและสามารถทำสิ่งต่าง ๆ เช่นการตอบสนองผ่าน WebSocket หรือเริ่มกระบวนการวิ่งระยะยาวซึ่งปกติจะถูกฆ่าตายหลังจากผ่านไป 30 วินาทีโดยเส้นทาง PHP ปกติ
อย่างไรก็ตามผลประโยชน์เหล่านั้นมาพร้อมกับข้อเสียสองประการที่สำคัญ อย่างแรกคือถ้าส่วนขยายยกข้อยกเว้นที่ไม่ถูกต้องหรือผิดพลาดเป็นอย่างอื่นจะต้องใช้เว็บเซิร์ฟเวอร์ทั้งหมดด้วย ประการที่สองคือการเปลี่ยนรหัสเป็นส่วนขยายต้องรีสตาร์ทเว็บเซิร์ฟเวอร์เพื่อทดสอบการเปลี่ยนแปลงซึ่งอาจเป็นเรื่องยุ่งยากเล็กน้อย โดยทั่วไปเส้นทาง 'www' ปกติเพียงพอสำหรับความต้องการและส่วนขยายส่วนใหญ่สำหรับส่วนของตรรกะเฉพาะเป็นครั้งคราว
ส่วนขยายโทเค็นความปลอดภัยที่รวมอยู่เป็นจุดเริ่มต้นที่ยอดเยี่ยมสำหรับการสร้างส่วนขยายที่สามารถจัดการคำขอได้อย่างเหมาะสม การขยายโทเค็นความปลอดภัยนั้นค่อนข้างสั้นความเก่งและการทำงาน
เซิร์ฟเวอร์สันนิษฐานว่าชื่อไฟล์เป็นส่วนหนึ่งของชื่อคลาส ไม่ว่าไฟล์ PHP จะชื่อไม่ว่าชื่อคลาสภายในจะต้องตามหลังชุดสูทมิฉะนั้นเซิร์ฟเวอร์แอพ PHP จะไม่สามารถโหลดส่วนขยายได้ ชื่อส่วนขยายควรเริ่มต้นด้วยตัวเลขซึ่งระบุลำดับที่คาดหวังซึ่งจะเรียกส่วนขยาย
ตัวแปรที่มีให้กับสคริปต์ PHP ปกตินั้นมีให้สำหรับส่วนขยายผ่านตัวแปร $baseenv ทั่วโลก (เช่น $baseenv["DOCUMENT_ROOT_USER"] และ $baseenv["PAS_USER_FILES"] ) โปรดอย่าเปลี่ยนค่า $baseenv ซึ่งจะส่งผลเสียต่อแอปพลิเคชันที่เหลือ
ใช้ฟังก์ชั่ ProcessHelper::StartProcess() เสมอเมื่อเริ่มกระบวนการภายนอกและดำเนินการระยะยาวภายในส่วนขยาย คลาส ProcessHelper ได้รับการออกแบบมาเพื่อเริ่มกระบวนการที่ไม่ปิดกั้นในพื้นหลังในทุกแพลตฟอร์ม โปรดทราบว่าวิธีที่ต้องการในการเริ่มต้นกระบวนการที่ดำเนินมายาวนานคือการใช้ส่วนขยายกระบวนการที่ดำเนินมายาวนาน
สำหรับงานบางอย่างสิ่งสำคัญคือต้องบอกให้เซิร์ฟเวอร์แอพ PHP ออกจาก ตัวอย่างเช่นเมื่ออัพเกรดแอปพลิเคชันแอพ PHP แอพเซิร์ฟเวอร์บน Windows PHP นั้นจำเป็นต้องได้รับการอัปเดตดังนั้นจึงไม่สามารถทำงานได้ในระหว่างการอัพเกรด นอกจากนี้ยังเป็นพฤติกรรมที่ดีในการออกจากแอปพลิเคชันไม่นานหลังจากปิดแท็บเบราว์เซอร์สุดท้าย
มีสองวิธีที่มีอยู่สำหรับการเรียกการยกเลิกก่อนกำหนดของเซิร์ฟเวอร์:
/exit-app/ และส่ง authtoken ที่ถูกต้องและ delay ในวัตถุ JSON ที่ระบุจำนวนวินาทีเพื่อรอการยกเลิกเซิร์ฟเวอร์ เมื่อใช้แล้วทุกหน้าของแอพจะต้องเชื่อมต่อกับ /exit-app/ เพื่อให้เซิร์ฟเวอร์มีชีวิตอยู่ แนะนำให้ใช้ความล่าช้าขั้นต่ำ 3 วินาที เว็บเบราว์เซอร์มีแนวโน้มที่จะลดการเชื่อมต่อ WebSocket ทันทีที่ออกจากหน้าหรือปิดแท็บX-Exit-App ในการตอบสนองของสคริปต์ PHP ค่าของส่วนหัวคือจำนวนเต็มจำนวนวินาทีที่จะรอที่จะยกเลิกเซิร์ฟเวอร์ แนะนำให้ใช้ความล่าช้าขั้นต่ำ 3 วินาที ส่วนหัวพิเศษนี้ไม่ได้ส่งผ่านไปยังเว็บเบราว์เซอร์ แต่จัดการภายในตัวอย่างรหัส PHP สำหรับวิธีการขยายแอปออก:
<script type="text/javascript">
// NOTE: Always put WebSocket class instances in a Javascript closure like this one to limit the XSRF attack surface.
( function () {
function InitExitApp ()
{
var ws = new WebSocket ((window.location.protocol === ' https: ' ? ' wss:// ' : ' ws:// ' ) + window.location.host + ' /exit-app/ ' );
ws. addEventListener ( ' open ' , function ( e ) {
var msg = {
authtoken: ' <?=hash_hmac("sha256", "/exit-app/", $_SERVER["PAS_SECRET"])?> ' ,
delay: 3
};
ws. send ( JSON . stringify (msg));
});
ws. addEventListener ( ' close ' , function ( e ) {
setTimeout (InitExitApp, 500 );
});
}
InitExitApp ();
})();
</script>ตัวอย่างรหัส PHP สำหรับวิธีการส่วนหัว:
<?php
// User clicked an "Exit application" link or something.
header ( " X-Exit-App: 3 " );
?>ส่วนขยายเป็นวิธีที่เชื่อถือได้มากขึ้นในการตรวจจับว่าแท็บเบราว์เซอร์ทั้งหมดไปยังแอปพลิเคชันถูกปิด อย่างไรก็ตามหากแอปพลิเคชันไม่สามารถรองรับส่วนขยายด้วยเหตุผลบางอย่างให้ใช้วิธีส่วนหัวแทน วิธีการส่วนหัวนั้นใช้งานได้ดีที่สุดในหน้าเว็บที่เหมาะสม (เช่นหน้าเว็บพร้อมข้อมูลการอัพเกรด)
ก่อนที่จะเรียกใช้สคริปต์ต่าง ๆ ที่สร้างแพ็คเกจติดตั้งจำเป็นต้องสร้างไฟล์ต่าง ๆ เปลี่ยนชื่อและ/หรือแก้ไข ทุกไฟล์ที่เริ่มต้นด้วย "YourApp" จะต้องเปลี่ยนชื่อเป็นชื่อแอปพลิเคชันของคุณโดยเฉพาะอย่างยิ่ง จำกัด เฉพาะ AZ และยัติภังค์ตัวพิมพ์เล็กทั้งหมด สิ่งนี้จะต้องทำเพื่อให้การอัปเดตซอฟต์แวร์ไม่ได้เขียนทับงานของคุณโดยไม่ตั้งใจและเพื่อให้ผู้ใช้ที่มีจมูกอยู่ใด ๆ ที่โผล่ออกมารอบ ๆ โครงสร้างไดเรกทอรีดูชื่อจริงของแอปพลิเคชันแทน "YourApp"
ไฟล์ 'yourapp.phpapp' เป็นไฟล์ PHP ที่ดำเนินการตามลำดับการเริ่มต้นแอปพลิเคชันจริงของการเริ่มต้นเว็บเซิร์ฟเวอร์ (Server.PHP) จากนั้นเรียกใช้เว็บเบราว์เซอร์ของผู้ใช้ มีอาร์เรย์ $options ในไฟล์ที่ควรแก้ไขสำหรับความต้องการของแอปพลิเคชันของคุณ:
สามตัวเลือกสุดท้ายมีไว้สำหรับสถานการณ์ที่มีความเชี่ยวชาญสูง การเปลี่ยน 'โฮสต์' เป็นบางอย่างเช่น "127.0.1.1" อาจโอเค แต่อย่าใช้ "0.0.0.0" หรือ ":: 0" ซึ่งผูกเซิร์ฟเวอร์ต่อสาธารณะกับอินเทอร์เฟซเครือข่าย การเชื่อมโยงกับหมายเลข 'พอร์ต' ที่เฉพาะเจาะจงอาจดูเหมือนเป็นความคิดที่ดีจนกว่าผู้ใช้จะเริ่มบ่นเกี่ยวกับข้อความแสดงข้อผิดพลาดเมื่อพวกเขาพยายามที่จะรีสตาร์ทแอปพลิเคชัน
ตัวเลือก 'Quitdelay' น่าสนใจ ส่วนเซิร์ฟเวอร์ของเซิร์ฟเวอร์แอพพลิเคชั่น PHP จะติดอยู่จนกระทั่ง 'quitdelay' นาทีหลังจากยกเลิกการเชื่อมต่อไคลเอนต์ล่าสุด แอปพลิเคชันควรส่งคำขอ "HeartBeat" ทุก ๆ ห้านาทีเพื่อรับประกันว่าเว็บเซิร์ฟเวอร์จะไม่ยุติตัวเองก่อนที่ผู้ใช้จะเสร็จสิ้นการใช้แอปพลิเคชัน
เครื่องมือบรรจุภัณฑ์แต่ละแพลตฟอร์มมีคำแนะนำของตัวเอง:
xdg-utils (GNOME, KDE, XFCE ฯลฯ เป็นสิ่งที่ดี)มีปัญหาบรรจุภัณฑ์ที่รู้จักกันบ้าง:
ตัวติดตั้งและซอฟต์แวร์เซิร์ฟเวอร์มีเรื่องราวที่น่าสนใจอยู่เบื้องหลัง บางทีฉันอาจจะแบ่งปันเรื่องราวเหล่านั้นในวันหนึ่ง สำหรับตอนนี้เพลิดเพลินไปกับการสร้างแอปพลิเคชันต่อไปของคุณใน PHP App Server!