ฉันจะเรียกใช้สคริปต์ PHP ในพื้นหลังหลังจากส่งแบบฟอร์มได้อย่างไร


105

ปัญหา
ฉันมีแบบฟอร์มที่เมื่อส่งแล้วจะเรียกใช้โค้ดพื้นฐานเพื่อประมวลผลข้อมูลที่ส่งและแทรกลงในฐานข้อมูลเพื่อแสดงบนเว็บไซต์แจ้งเตือน นอกจากนี้ฉันมีรายชื่อผู้ที่สมัครรับการแจ้งเตือนเหล่านี้ทางอีเมลและข้อความ SMS รายการนี้เป็นเรื่องเล็กน้อยในขณะนี้ (เพียงแค่ผลักดันประมาณ 150) แต่ก็เพียงพอที่จะทำให้ต้องใช้เวลามากกว่าหนึ่งนาทีในการวนรอบตารางสมาชิกทั้งหมดและส่งอีเมลมากกว่า 150 ฉบับ (อีเมลจะถูกส่งทีละรายการตามที่ผู้ดูแลระบบของเซิร์ฟเวอร์อีเมลของเราร้องขอเนื่องจากนโยบายอีเมลจำนวนมาก)

ในช่วงเวลานี้บุคคลที่โพสต์การแจ้งเตือนจะนั่งอยู่ที่หน้าสุดท้ายของแบบฟอร์มเป็นเวลาเกือบหนึ่งนาทีโดยไม่มีการสนับสนุนเชิงบวกว่ามีการโพสต์การแจ้งเตือน สิ่งนี้นำไปสู่ปัญหาที่อาจเกิดขึ้นอื่น ๆ ทั้งหมดที่มีทางแก้ไขที่เป็นไปได้ซึ่งฉันรู้สึกว่าน้อยกว่าอุดมคติ

  1. ขั้นแรกผู้โพสต์อาจคิดว่าเซิร์ฟเวอร์ทำงานช้าและคลิกปุ่ม "ส่ง" อีกครั้งทำให้สคริปต์เริ่มต้นใหม่หรือทำงานสองครั้ง ฉันสามารถแก้ปัญหานี้ได้โดยใช้ JavaScript เพื่อปิดใช้งานปุ่มและแทนที่ข้อความเพื่อพูดบางอย่างเช่น 'กำลังประมวลผล ... ' อย่างไรก็ตามสิ่งนี้น้อยกว่าที่เหมาะสมเนื่องจากผู้ใช้จะยังคงติดอยู่บนหน้าสำหรับความยาวของการเรียกใช้สคริปต์ (นอกจากนี้หากปิดใช้งาน JavaScript ปัญหานี้ยังคงมีอยู่)

  2. ประการที่สองผู้โพสต์อาจปิดแท็บหรือเบราว์เซอร์ก่อนเวลาอันควรหลังจากส่งแบบฟอร์ม สคริปต์จะทำงานบนเซิร์ฟเวอร์ต่อไปจนกว่าจะพยายามเขียนกลับไปยังเบราว์เซอร์อย่างไรก็ตามหากผู้ใช้เรียกดูหน้าใด ๆ ภายในโดเมนของเรา (ในขณะที่สคริปต์ยังทำงานอยู่) เบราว์เซอร์จะหยุดการโหลดหน้าจนกว่าสคริปต์จะสิ้นสุดลง . (สิ่งนี้จะเกิดขึ้นก็ต่อเมื่อปิดแท็บหรือหน้าต่างของเบราว์เซอร์ไม่ใช่ทั้งแอปพลิเคชันเบราว์เซอร์) ถึงกระนั้นก็ยังน้อยกว่าที่เหมาะสม

(เป็นไปได้) วิธีแก้ไข
ฉันตัดสินใจว่าต้องการแยกส่วน "อีเมล" ของสคริปต์ออกเป็นไฟล์แยกต่างหากที่ฉันสามารถโทรได้หลังจากโพสต์การแจ้งเตือนแล้ว ตอนแรกฉันคิดว่าจะวางสิ่งนี้ไว้ในหน้ายืนยันหลังจากโพสต์การแจ้งเตือนสำเร็จแล้ว อย่างไรก็ตามผู้ใช้จะไม่ทราบว่าสคริปต์นี้กำลังทำงานอยู่และจะไม่ปรากฏความผิดปกติใด ๆ สคริปต์นี้ไม่สามารถล้มเหลว

แต่ถ้าฉันสามารถเรียกใช้สคริปต์นี้เป็นกระบวนการพื้นหลังได้ล่ะ? คำถามของฉันคือ: ฉันจะเรียกใช้สคริปต์ PHP เพื่อทริกเกอร์เป็นบริการพื้นหลังและเรียกใช้โดยไม่ขึ้นกับสิ่งที่ผู้ใช้ทำในระดับฟอร์มได้อย่างไร

แก้ไข:นี้ไม่สามารถจะ cron'ed ต้องเรียกใช้ทันทีที่ส่งแบบฟอร์ม นี่คือการแจ้งเตือนที่มีลำดับความสำคัญสูง นอกจากนี้ผู้ดูแลระบบที่เรียกใช้เซิร์ฟเวอร์ของเราไม่อนุญาตให้ crons ทำงานบ่อยเกิน 5 นาที


เริ่มงาน cron และแจ้งเตือนผู้ใช้ในเพจอื่นว่าคำขอของพวกเขากำลังดำเนินการหรืออะไรทำนองนั้น
Evan Mulawski

1
คุณต้องการเรียกใช้งานเป็นประจำ (ทุกวันหรือทุกชั่วโมง) หรือส่ง? ฉันเดาว่าคุณสามารถใช้ php ได้exec()แต่ฉันไม่เคยลองใช้
Simon

2
ฉันแค่ใช้ajaxและแทรกsleep()ด้วยช่วงเวลาภายในลูป (ฉันใช้ foreach ในกรณีของฉัน) เพื่อเรียกใช้กระบวนการพื้นหลัง มันทำงานได้อย่างสมบูรณ์ในเซิร์ฟเวอร์ของฉัน ไม่แน่ใจเกี่ยวกับคนอื่น ๆ นอกจากนี้ผมยังเพิ่มignore_user_abort()และset_time_limit()(มีเวลาสิ้นสุดคำนวณ) ก่อนที่จะห่วงเพื่อให้แน่ใจว่าสคริปต์จะไม่หยุดโดยการใช้เซิร์ฟเวอร์ฉันแม้ตามการทดสอบของฉันสคริปต์จบงานโดยไม่ได้และignore_user_abort() set_time_limit()
อารีย์

ฉันเห็นคุณคิดวิธีแก้ปัญหาแล้ว ฉันใช้gearmanกับ php เพื่อจัดการกับงานเบื้องหลัง เหมาะอย่างยิ่งที่จะปรับขนาดหากคุณเจอกับการประมวลผลครั้งใหญ่และงานหนัก คุณควรตรวจสอบมัน
Andre Garcia

ติดตามคำตอบนี้ได้ที่ [stackoverflow] ( stackoverflow.com/a/46617107/6417678 )
Joshy Francis

คำตอบ:


89

ทำการทดลองexecและshell_execฉันได้ค้นพบวิธีแก้ปัญหาที่ทำงานได้อย่างสมบูรณ์แบบ! ฉันเลือกที่จะใช้shell_execเพื่อบันทึกทุกขั้นตอนการแจ้งเตือนที่เกิดขึ้น (หรือไม่) ( shell_execส่งคืนเป็นสตริงซึ่งง่ายกว่าการใช้execกำหนดเอาต์พุตให้กับตัวแปรจากนั้นเปิดไฟล์เพื่อเขียน)

ฉันใช้บรรทัดต่อไปนี้เพื่อเรียกใช้สคริปต์อีเมล:

shell_exec("/path/to/php /path/to/send_notifications.php '".$post_id."' 'alert' >> /path/to/alert_log/paging.log &");

สิ่งสำคัญคือต้องสังเกต&ที่ท้ายคำสั่ง (ตามที่ @netcoder ชี้ให้เห็น) คำสั่ง UNIX นี้เรียกใช้กระบวนการในเบื้องหลัง

ตัวแปรพิเศษที่ล้อมรอบด้วยเครื่องหมายคำพูดเดียวหลังจากเส้นทางไปยังสคริปต์ถูกตั้งค่าเป็น$_SERVER['argv']ตัวแปรที่ฉันสามารถเรียกใช้ภายในสคริปต์ของฉันได้

จากนั้นสคริปต์อีเมลจะส่งออกไปยังไฟล์บันทึกของฉันโดยใช้>>และจะแสดงผลลัพธ์ดังนี้:

[2011-01-07 11:01:26] Alert Notifications Sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 38.71 seconds)
[2011-01-07 11:01:34] CRITICAL ERROR: Alert Notifications NOT sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 23.12 seconds)

ขอบคุณ. สิ่งนี้ช่วยชีวิตฉัน
Liam Bailey

นั่นคือสิ่งที่$post_idหลังจากเส้นทางของสคริปต์ PHP ได้หรือไม่
Perocat

@Perocat เป็นตัวแปรที่คุณกำลังส่งไปยังสคริปต์ ในกรณีนี้เป็นการส่ง ID ซึ่งจะเป็นพารามิเตอร์ของสคริปต์ที่ถูกเรียก
Chique

ฉันสงสัยว่ามันจะทำงานได้อย่างสมบูรณ์โปรดดูstackoverflow.com/questions/2212635/…
symcbean

1
มีอยู่ระหว่างดำเนินการแก้ไขข้อเสนอแนะที่จะหลบหนี$post_id; ฉันอยากจะส่งมันไปยังตัวเลขโดยตรง: (int) $post_id. (เรียกร้องความสนใจของคุณเพื่อตัดสินใจว่าอันไหนดีกว่ากัน)
Al.G.

19

บนเซิร์ฟเวอร์ Linux / Unix คุณสามารถรันงานในเบื้องหลังได้โดยใช้proc_open :

$descriptorspec = array(
   array('pipe', 'r'),               // stdin
   array('file', 'myfile.txt', 'a'), // stdout
   array('pipe', 'w'),               // stderr
);

$proc = proc_open('php email_script.php &', $descriptorspec, $pipes);

&เป็นบิตที่สำคัญที่นี่ สคริปต์จะดำเนินต่อไปแม้ว่าสคริปต์ต้นฉบับจะสิ้นสุดลงแล้วก็ตาม


สิ่งนี้ใช้ได้ผลเมื่อฉันไม่โทรหาproc_closeเมื่องานเสร็จสมบูรณ์ proc_closeทำให้สคริปต์ค้างประมาณ 15 ถึง 25 วินาที ฉันจะต้องเก็บบันทึกโดยใช้ข้อมูลไปป์ดังนั้นฉันต้องเปิดไฟล์ที่จะเขียนปิดแล้วปิดการเชื่อมต่อ proc น่าเสียดายที่วิธีนี้ใช้ไม่ได้กับฉัน
Michael Irigoyen

3
แน่นอนว่าคุณไม่เรียกproc_closeนั่นคือประเด็น! และใช่คุณสามารถไพพ์ไฟล์ด้วยproc_open. ดูคำตอบที่อัปเดต
netcoder

@netcoder: จะเกิดอะไรขึ้นถ้าฉันไม่ต้องการเก็บผลลัพธ์ไว้ในไฟล์ใด ๆ จำเป็นต้องมีการเปลี่ยนแปลงอะไรบ้างใน stdout?
naggarwal11

10

จากคำตอบทั้งหมดไม่มีใครถือว่าเป็นฟังก์ชันfastcgi_finish_request ที่ง่ายอย่างน่าขันซึ่งเมื่อเรียกใช้จะล้างเอาต์พุตที่เหลือทั้งหมดไปยังเบราว์เซอร์และปิดเซสชัน Fastcgi และการเชื่อมต่อ HTTP ในขณะที่ปล่อยให้สคริปต์ทำงานในพื้นหลัง

ตัวอย่าง:

<?php
header('Content-Type: application/json');
echo json_encode(['ok' => true]);
fastcgi_finish_request(); // The user is now disconnected from the script

// do stuff with received data,

นี่คือสิ่งที่ฉันกำลังมองหาใน shell_exec ฉันต้องถ่ายโอนข้อมูลที่โพสต์ไปยังสคริปต์ที่ดำเนินการซึ่งเป็นงานที่ใช้เวลานานในกรณีของฉันและทำให้สิ่งต่าง ๆ ซับซ้อนมาก
Aurangzeb

7

PHP exec("php script.php")สามารถทำได้

จากคู่มือ :

หากโปรแกรมเริ่มต้นด้วยฟังก์ชันนี้เพื่อให้โปรแกรมทำงานในพื้นหลังต่อไปเอาต์พุตของโปรแกรมจะต้องถูกเปลี่ยนทิศทางไปยังไฟล์หรือสตรีมเอาต์พุตอื่น หากไม่ทำเช่นนั้นจะทำให้ PHP ค้างจนกว่าการทำงานของโปรแกรมจะสิ้นสุดลง

ดังนั้นหากคุณเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์บันทึก (ควรคิดอย่างไรดี) สคริปต์การโทรของคุณจะไม่ค้างและสคริปต์อีเมลของคุณจะทำงานใน bg


1
ขอบคุณ แต่ไม่ได้ผล สคริปต์ยังคง "แฮงค์" ในขณะที่ประมวลผลไฟล์ที่สอง
Michael Irigoyen

ดูที่php.net/manual/en/function.exec.php#80582 ที่ยกย่องเนื่องจากเปิดใช้งาน Safe_mode มีวิธีแก้ปัญหาภายใต้ยูนิกซ์
Simon

ขออภัยไม่ได้เปิดใช้งานเซฟโหมดในการติดตั้งของเรา มันแปลกที่มันยังคงแขวนอยู่
Michael Irigoyen

6

และทำไมไม่สร้างคำขอ HTTP บนสคริปต์และละเว้นการตอบสนอง?

http://php.net/manual/en/function.httprequest-send.php

หากคุณส่งคำขอในสคริปต์คุณจำเป็นต้องเรียกใช้เว็บเซิร์ฟเวอร์ของคุณจะเรียกใช้ในพื้นหลังและคุณสามารถ (ในสคริปต์หลักของคุณ) แสดงข้อความที่แจ้งให้ผู้ใช้ทราบว่าสคริปต์กำลังทำงานอยู่


4

แล้วเรื่องนี้ล่ะ?

  1. สคริปต์ PHP ของคุณที่เก็บแบบฟอร์มจะบันทึกค่าสถานะหรือค่าบางอย่างลงในฐานข้อมูลหรือไฟล์
  2. การสำรวจสคริปต์ PHP ครั้งที่สองสำหรับค่านี้เป็นระยะและหากมีการตั้งค่าไว้ระบบจะทริกเกอร์สคริปต์อีเมลในลักษณะซิงโครนัส

สคริปต์ PHP ที่สองนี้ควรถูกตั้งค่าให้ทำงานเป็น cron


ขอบคุณ แต่ฉันอัปเดตคำถามเดิมแล้ว Cron ไม่ใช่ตัวเลือกในกรณีนี้
Michael Irigoyen

4

อย่างที่ฉันรู้ว่าคุณไม่สามารถทำได้ด้วยวิธีง่ายๆ (ดู fork exec และอื่น ๆ (อย่าทำงานใน windows)) คุณสามารถย้อนกลับแนวทางได้โดยใช้พื้นหลังของเบราว์เซอร์ที่โพสต์แบบฟอร์มใน ajax ดังนั้นหากโพสต์ยังคงอยู่ ทำงานโดยไม่ต้องรอ
สิ่งนี้สามารถช่วยได้แม้ว่าคุณจะต้องทำรายละเอียดที่ยาวนานก็ตาม

เกี่ยวกับการส่งอีเมลขอแนะนำให้ใช้สพูลเลอร์เสมออาจเป็นเซิร์ฟเวอร์ smtp แบบโลคัลและรวดเร็วที่ยอมรับคำขอของคุณและสปูลไปยัง MTA จริงหรือใส่ทั้งหมดลงในฐานข้อมูลแทนที่จะใช้ cron ที่จัดคิว
cron อาจอยู่บนเครื่องอื่นที่เรียกสพูลเลอร์เป็น url ภายนอก:

* * * * * wget -O /dev/null http://www.example.com/spooler.php

3

งาน cron เบื้องหลังดูเหมือนเป็นความคิดที่ดีสำหรับสิ่งนี้

คุณจะต้องเข้าถึง ssh ไปยังเครื่องเพื่อเรียกใช้สคริปต์เป็น cron

$ php scriptname.php เพื่อเรียกใช้


1
ไม่จำเป็นต้องใช้ ssh โฮสต์หลายคนไม่อนุญาต ssh แต่มีการสนับสนุน cron
สัน

ขอบคุณ แต่ฉันอัปเดตคำถามเดิมแล้ว Cron ไม่ใช่ตัวเลือกในกรณีนี้
Michael Irigoyen

3

หากคุณสามารถเข้าถึงเซิร์ฟเวอร์ผ่าน ssh และสามารถเรียกใช้สคริปต์ของคุณเองได้คุณสามารถสร้างเซิร์ฟเวอร์ fifo แบบง่ายๆโดยใช้ php (แม้ว่าคุณจะต้องคอมไพล์ php ใหม่ด้วยposixการสนับสนุนfork)

เซิร์ฟเวอร์สามารถเขียนอะไรก็ได้จริงๆคุณอาจทำได้อย่างง่ายดายใน python

หรือวิธีแก้ปัญหาที่ง่ายที่สุดคือส่งHttpRequestและไม่อ่านข้อมูลที่ส่งคืน แต่เซิร์ฟเวอร์อาจทำลายสคริปต์ก่อนที่จะประมวลผลเสร็จสิ้น

เซิร์ฟเวอร์ตัวอย่าง:

<?php
define('FIFO_PATH', '/home/user/input.queue');
define('FORK_COUNT', 10);

if(file_exists(FIFO_PATH)) {
    die(FIFO_PATH . ' exists, please delete it and try again.' . "\n");
}

if(!file_exists(FIFO_PATH) && !posix_mkfifo(FIFO_PATH, 0666)){
    die('Couldn\'t create the listening fifo.' . "\n");
}

$pids = array();
$fp = fopen(FIFO_PATH, 'r+');
for($i = 0; $i < FORK_COUNT; ++$i) {
    $pids[$i] = pcntl_fork();
    if(!$pids[$i]) {
        echo "process(" . posix_getpid() . ", id=$i)\n";
        while(true) {
            $line = chop(fgets($fp));
            if($line == 'quit' || $line === false) break;
            echo "processing (" . posix_getpid() . ", id=$i) :: $line\n";
        //  $data = json_decode($line);
        //  processData($data);
        }
        exit();
    }
}
fclose($fp);
foreach($pids as $pid){
    pcntl_waitpid($pid, $status);
}
unlink(FIFO_PATH);
?>

ลูกค้าตัวอย่าง:

<?php
define('FIFO_PATH', '/home/user/input.queue');
if(!file_exists(FIFO_PATH)) {
    die(FIFO_PATH . ' doesn\'t exist, please make sure the fifo server is running.' . "\n");
}

function postToQueue($data) {
    $fp = fopen(FIFO_PATH, 'w+');
    stream_set_blocking($fp, false); //don't block
    $data = json_encode($data) . "\n";
    if(fwrite($fp, $data) != strlen($data)) {
        echo "Couldn't the server might be dead or there's a bug somewhere\n";
    }
    fclose($fp);
}
$i = 1000;
while(--$i) {
    postToQueue(array('xx'=>21, 'yy' => array(1,2,3)));
}
?>

3

วิธีที่ง่ายกว่าในการเรียกใช้สคริปต์ PHP ในพื้นหลังคือ

php script.php >/dev/null &

สคริปต์จะทำงานในพื้นหลังและหน้านี้จะไปถึงหน้าการทำงานได้เร็วขึ้น


2

สมมติว่าคุณใช้งานบนแพลตฟอร์ม * nix ให้ใช้cronและไฟล์phpปฏิบัติการ

แก้ไข:

มีคำถามจำนวนมากที่ถามถึง "การรัน php โดยไม่ใช้ cron" บน SO อยู่แล้ว นี่คือหนึ่ง:

กำหนดเวลาสคริปต์โดยไม่ใช้ CRON

ที่กล่าวว่าคำตอบ exec () ข้างต้นฟังดูมีแนวโน้มมาก :)


ขอบคุณ แต่ฉันอัปเดตคำถามเดิมแล้ว Cron ไม่ใช่ตัวเลือกในกรณีนี้
Michael Irigoyen

2

หากคุณใช้ Windows ให้ค้นคว้าproc_openหรือpopen...

แต่ถ้าเราอยู่บนเซิร์ฟเวอร์เดียวกัน "Linux" ที่ใช้ cpanel นี่เป็นแนวทางที่ถูกต้อง:

#!/usr/bin/php 
<?php
$pid = shell_exec("nohup nice php -f            
'path/to/your/script.php' /dev/null 2>&1 & echo $!");
While(exec("ps $pid"))
{ //you can also have a streamer here like fprintf,        
 // or fgets
}
?>

อย่าใช้fork()หรือcurlหากคุณสงสัยว่าคุณสามารถจัดการได้ก็เหมือนกับการใช้เซิร์ฟเวอร์ของคุณในทางที่ผิด

สุดท้ายบนscript.phpไฟล์ที่เรียกด้านบนให้จดบันทึกสิ่งนี้ให้แน่ใจว่าคุณได้เขียน:

<?php
ignore_user_abort(TRUE);
set_time_limit(0);
ob_start();
// <-- really optional but this is pure php

//Code to be tested on background

ob_flush(); flush(); 
//this two do the output process if you need some.        
//then to make all the logic possible


str_repeat(" ",1500); 
//.for progress bars or loading images

sleep(2); //standard limit

?>

ขออภัยสำหรับการแก้ไขในภายหลังเนื่องจากฉันใช้โทรศัพท์มือถือของฉันและแน่นอนว่ามันยากกว่าการเขียนสคริปต์ exec () ฮ่า ๆ ;)
ฉันคือ ArbZ

2

สำหรับผู้ทำงานเบื้องหลังฉันคิดว่าคุณควรลองใช้เทคนิคนี้ซึ่งจะช่วยในการเรียกหน้าเว็บให้มากที่สุดเท่าที่คุณชอบทุกหน้าจะทำงานพร้อมกันโดยไม่ต้องรอให้การตอบสนองแต่ละหน้าเป็นแบบอะซิงโครนัส

form_action_page.php

     <?php

    post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue");
    //post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue2");
    //post_async("http://localhost/projectname/otherpage.php", "Keywordname=anyValue");
    //call as many as pages you like all pages will run at once //independently without waiting for each page response as asynchronous.

  //your form db insertion or other code goes here do what ever you want //above code will work as background job this line will direct hit before //above lines response     
                ?>
                <?php

                /*
                 * Executes a PHP page asynchronously so the current page does not have to wait for it to     finish running.
                 *  
                 */
                function post_async($url,$params)
                {

                    $post_string = $params;

                    $parts=parse_url($url);

                    $fp = fsockopen($parts['host'],
                        isset($parts['port'])?$parts['port']:80,
                        $errno, $errstr, 30);

                    $out = "GET ".$parts['path']."?$post_string"." HTTP/1.1\r\n";//you can use POST instead of GET if you like
                    $out.= "Host: ".$parts['host']."\r\n";
                    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
                    $out.= "Content-Length: ".strlen($post_string)."\r\n";
                    $out.= "Connection: Close\r\n\r\n";
                    fwrite($fp, $out);
                    fclose($fp);
                }
                ?>

testpage.php

    <?
    echo $_REQUEST["Keywordname"];//case1 Output > testValue
//here do your background operations it will not halt main page
    ?>

PS: หากคุณต้องการส่งพารามิเตอร์ url เป็นลูปให้ทำตามคำตอบนี้: https://stackoverflow.com/a/41225209/6295712


0

ในกรณีของฉันฉันมี 3 params หนึ่งในนั้นคือ string (mensaje):

exec("C:\wamp\bin\php\php5.5.12\php.exe C:/test/N/trunk/api/v1/Process.php $idTest2 $idTest3 \"$mensaje\" >> c:/log.log &");

ใน Process.php ของฉันฉันมีรหัสนี้:

if (!isset($argv[1]) || !isset($argv[2]) || !isset($argv[3]))
{   
    die("Error.");
} 

$idCurso = $argv[1];
$idDestino = $argv[2];
$mensaje = $argv[3];

0

นี่ใช้ได้สำหรับฉัน พิมพ์สิ่งนี้

exec(“php asyn.php”.” > /dev/null 2>/dev/null &“);

จะเกิดอะไรขึ้นถ้าฉันมีค่าโพสต์ จากแบบฟอร์มและฉันส่งผ่าน ajax และ serialize()ฟังก์ชัน ตัวอย่างเช่นฉันมีindex.php แบบฟอร์มและฉันส่งค่าผ่าน ajax ไปยัง index2.php ฉันต้องการดำเนินการส่งข้อมูลใน index2.php ในพื้นหลังคุณแนะนำอะไร? ขอบคุณ
khalid JA

0

ใช้Amphpเพื่อดำเนินการงานแบบขนาน & แบบอะซิงโครนัส

ติดตั้งไลบรารี

composer require amphp/parallel-functions

ตัวอย่างโค้ด

<?php

require "vendor/autoload.php";

use Amp\Promise;
use Amp\ParallelFunctions;


echo 'started</br>';

$promises[1] = ParallelFunctions\parallel(function (){
    // Send Email
})();

$promises[2] = ParallelFunctions\parallel(function (){
    // Send SMS
})();


Promise\wait(Promise\all($promises));

echo 'finished';

สำหรับกรณีการใช้งานของคุณคุณสามารถทำสิ่งต่างๆดังต่อไปนี้

<?php

use function Amp\ParallelFunctions\parallelMap;
use function Amp\Promise\wait;

$responses = wait(parallelMap([
    'a@example.com',
    'b@example.com',
    'c@example.com',
], function ($to) {
    return send_mail($to);
}));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.