Cara menggunakan does php support thread?

Apakah ada cara realistis untuk mengimplementasikan model multi-threaded di PHP baik benar, atau hanya mensimulasikannya. Beberapa waktu lalu disarankan agar Anda dapat memaksa sistem operasi untuk memuat contoh lain dari executable PHP dan menangani proses simultan lainnya.

Masalah dengan ini adalah bahwa ketika kode PHP selesai mengeksekusi instance PHP tetap ada dalam memori karena tidak ada cara untuk membunuhnya dari dalam PHP. Jadi jika Anda mensimulasikan beberapa utas, Anda dapat membayangkan apa yang akan terjadi. Jadi saya masih mencari cara multi-threading dapat dilakukan atau disimulasikan secara efektif dari dalam PHP. Ada ide?

Jawaban:

Multi-threading dimungkinkan dalam php

Ya, Anda bisa melakukan multi-threading dalam PHP dengan pthreads

Dari dokumentasi PHP :

pthreads adalah API berorientasi objek yang menyediakan semua alat yang diperlukan untuk multi-threading di PHP. Aplikasi PHP dapat membuat, membaca, menulis, menjalankan dan menyinkronkan dengan Thread, Pekerja dan objek Thread.

Peringatan : Ekstensi pthreads tidak dapat digunakan di lingkungan server web. Threading dalam PHP karena itu harus tetap hanya untuk aplikasi berbasis CLI.

Tes sederhana

#!/usr/bin/php

Lari pertama

12:00:06pm:     A  -start -sleeps 5
12:00:06pm:     B  -start -sleeps 3
12:00:06pm:     C  -start -sleeps 10
12:00:06pm:     D  -start -sleeps 2
12:00:08pm:     D  -finish
12:00:09pm:     B  -finish
12:00:11pm:     A  -finish
12:00:16pm:     C  -finish

Jalankan Kedua

12:01:36pm:     A  -start -sleeps 6
12:01:36pm:     B  -start -sleeps 1
12:01:36pm:     C  -start -sleeps 2
12:01:36pm:     D  -start -sleeps 1
12:01:37pm:     B  -finish
12:01:37pm:     D  -finish
12:01:38pm:     C  -finish
12:01:42pm:     A  -finish

Contoh Dunia Nyata

error_reporting[E_ALL];
class AsyncWebRequest extends Thread {
    public $url;
    public $data;

    public function __construct[$url] {
        $this->url = $url;
    }

    public function run[] {
        if [[$url = $this->url]] {
            /*
             * If a large amount of data is being requested, you might want to
             * fsockopen and read using usleep in between reads
             */
            $this->data = file_get_contents[$url];
        } else
            printf["Thread #%lu was not provided a URL\n", $this->getThreadId[]];
    }
}

$t = microtime[true];
$g = new AsyncWebRequest[sprintf["//www.google.com/?q=%s", rand[] * 10]];
/* starting synchronization */
if [$g->start[]] {
    printf["Request took %f seconds to start ", microtime[true] - $t];
    while [ $g->isRunning[] ] {
        echo ".";
        usleep[100];
    }
    if [$g->join[]] {
        printf[" and %f seconds to finish receiving %d bytes\n", microtime[true] - $t, strlen[$g->data]];
    } else
        printf[" and %f seconds to finish, request failed\n", microtime[true] - $t];
}

kenapa kamu tidak menggunakan popen ?

for [$i=0; $i

pcntl_forktidak akan berfungsi di lingkungan server web jika telah mengaktifkan mode aman . Dalam hal ini, itu hanya akan berfungsi dalam versi PHP CLI.

Jika Anda menggunakan server Linux, Anda dapat menggunakan

exec["nohup $php_path path/script.php > /dev/null 2>/dev/null &"]

Jika Anda perlu melewati beberapa argumen

exec["nohup $php_path path/script.php $args > /dev/null 2>/dev/null &"]

Di script.php

$args = $argv[1];

Atau gunakan Symfony //symfony.com/doc/current/components/process.html

$process = Process::fromShellCommandline["php ".base_path['script.php']];
$process->setTimeout[0];     
$process->disableOutput[];     
$process->start[];

Pada penulisan komentar saya saat ini, saya tidak tahu tentang utas-utas PHP. Saya datang untuk mencari sendiri jawabannya di sini, tetapi satu solusi adalah bahwa program PHP yang menerima permintaan dari server web mendelegasikan seluruh jawaban formulasi ke aplikasi konsol yang menyimpan outputnya, jawaban atas permintaan, ke file biner dan program PHP yang meluncurkan aplikasi konsol mengembalikan file biner byte-by-byte sebagai jawaban atas permintaan yang diterima. Aplikasi konsol dapat ditulis dalam bahasa pemrograman apa pun yang berjalan di server, termasuk yang memiliki dukungan threading yang tepat, termasuk program C ++ yang menggunakan OpenMP.

Satu trik yang tidak dapat diandalkan, kotor, adalah menggunakan PHP untuk menjalankan aplikasi konsol, "tidak sama",

uname -a

dan cetak output dari perintah konsol itu ke output HTML untuk mengetahui versi yang tepat dari perangkat lunak server. Kemudian instal versi perangkat lunak yang sama persis ke instance VirtualBox, kompilasi / kumpulkan biner apa pun yang sepenuhnya mandiri, lebih disukai statis, yang diinginkan dan kemudian unggah ke server. Sejak saat itu dan seterusnya aplikasi PHP dapat menggunakan binari-binari tersebut dalam peran aplikasi konsol yang memiliki multi-threading yang tepat. Ini adalah solusi yang kotor, tidak dapat diandalkan, solusi untuk suatu situasi, ketika administrator server belum menginstal semua implementasi bahasa pemrograman yang diperlukan ke server. Hal yang harus diperhatikan adalah bahwa pada setiap permintaan aplikasi PHP menerima aplikasi konsol berakhir / keluar / get_killed.

Mengenai apa yang dipikirkan oleh administrator layanan hosting tentang pola penggunaan server seperti itu, saya kira itu bermuara pada budaya. Di Eropa Utara penyedia layanan HARUS MEMBERIKAN APA YANG DI IKLAN dan jika eksekusi perintah konsol diizinkan dan mengunggah file non-malware diizinkan dan penyedia layanan memiliki hak untuk membunuh proses server apa pun setelah beberapa menit atau bahkan setelah 30 detik , maka administrator layanan hosting tidak memiliki argumen untuk membentuk keluhan yang tepat. Di Amerika Serikat dan Eropa Barat situasi / budaya sangat berbeda dan saya percaya bahwa ada peluang besar bahwa di AS dan / atau Eropa Barat penyedia layanan hosting akan menolak untuk melayani klien layanan hosting yang menggunakan trik yang dijelaskan di atas. Itu hanya tebakan saya, mengingat pengalaman pribadi saya dengan AS layanan hosting dan memberikan apa yang saya dengar dari orang lain tentang layanan hosting Eropa Barat. Pada saat menulis komentar saya saat ini [2018_09_01] saya tidak tahu apa-apa tentang norma-norma budaya penyedia layanan hosting Eropa Selatan, administrator jaringan Eropa Selatan.

Mungkin saya melewatkan sesuatu tetapi exec tidak bekerja sebagai tidak sinkron untuk saya di lingkungan windows yang saya gunakan berikut di windows dan itu bekerja seperti pesona;]

$script_exec = "c:/php/php.exe c:/path/my_ascyn_script.php";

pclose[popen["start /B ". $script_exec, "r"]];

Multithreading berarti melakukan banyak tugas atau proses secara bersamaan, kita dapat mencapai hal ini dalam php dengan menggunakan kode berikut, meskipun tidak ada cara langsung untuk mencapai multithreading di php tetapi kita dapat mencapai hasil yang hampir sama dengan mengikuti cara.

chdir[dirname[__FILE__]];  //if you want to run this file as cron job
 for [$i = 0; $i 

Bài mới nhất

Chủ Đề