Cara menggunakan php new thread

One working(though ugly) solution is to create SOAP web service and invoke it from your script with extended SoapClient by overriding "$oneWay" parameter (http://www.php.net/manual/en/soapclient.dorequest.php).

    class AsyncSoapClient extends SoapClient {
      function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
      }

      function __doRequest($request, $location, $action, $version, $oneWay = TRUE) {
        return parent::__doRequest($request, $location, $action, $version, TRUE);
      }
    }

    $client = new AsyncSoapClient(
      NULL,
      array(
        'location' => $location,
        'uri'      => $uri
      )
    );

    $client->invokeMethodOnServer($yourParameters);

In this case making one way request means that your script doesn't need to wait for response and execution of your code will continue.

start();
}
foreach($pool as $worker){
    $worker->join();
}
?>
//coba gan yang bisa akses di browser
Gan boleh nanya gak soal threading gimana cara pake nya disini saya pake pthreads... apakah ada alternatif lain untuk multi threading?

class workerThread extends Thread {
public function __construct($i){
  $this->i=$i;
}

public function run(){
  while(true){
   echo $this->i;
   sleep(1);
  }
}
}

for($i=0;$i<50;$i++){
$workers[$i]=new workerThread($i);
$workers[$i]->start();
}

?>

Tunggu sampai terinstall. sekarang lanjut setting extension pthreads.so supaya bisa dijalankan oleh PHP. tambahkan baris ini ke bagian extension pada file /usr/local/lib/php.ini

extension=pthreads.so

Nah sekarang pthreads sudah terinstall, berarti sudah saat ini kita mencoba koding PHP dengan metode Thread Process. Pertama salin koding di bawah ini dan simpan sebagai file php dengan nama "baca_buku.php" dan jalankan di PHP CLI.

<?php
    class BacaBuku extends Thread {
        public $arg ;
        public $rangkuman ;
       
        public function __construct($arg) {
            $this->arg = $arg;
        }
       
        public function run() {
            if ($this->arg) {
                # Acak Perkiraan Waktu Membaca
                $sleep = mt_rand(5, 30);
                print "<".$this->arg['nama'] . "> Saya Mulai Baca Buku '". $this->arg['buku'] . "' Kira-Kira $sleep Detik\n" ;
                # Simulasi Lama Waktu Membaca
                sleep($sleep);
                print "<".$this->arg['nama'] . "> Selesai Baca Buku '". $this->arg['buku'] . "' Dalam Waktu $sleep Detik\n" ;
                $this->rangkuman = "Rangkuman " . $this->arg['nama'] . " Untuk Buku '" . $this->arg['buku'] . "' Dalam Waktu $sleep Detik. Tolong disimpan" ;
            }
        }
    }
   
    # Siapkan Antrian Buku Yang Mau Dibaca
    $AntrianBuku = array('Bobo','Donal Bebek','Doraemon','Kungfu Boy','Dragon Ball','Harry Potter','Hunger Games','Miki Tikus','Peter Pan','Dongeng') ;
   
    # Siapkan Data Pembaca
    $SemuaPembaca = array('Diana','Robin','Hendi') ;
    $RangkumanSemua = array() ;
    $Antrian = array() ;
    $prevText = "" ;
    while (true) {
        # Memberikan Pekerjaan Kepada Pembaca Jika Masih Ada Buku Yang Belum Dibaca
        foreach ($SemuaPembaca as $Pembaca) {
            if (!isset($Antrian[$Pembaca])) {
                if (count($AntrianBuku) > 0) {
                    $bukuSaatIni = array_shift($AntrianBuku) ;
                    $Antrian[$Pembaca] = new BacaBuku(array('nama' => $Pembaca, 'buku' => $bukuSaatIni)) ;
                    $Antrian[$Pembaca]->start() ;
                }
            }
        }
        if (count($AntrianBuku) <= 0 && count($Antrian) <= 0) {
            # Jika Buku Habis & Semua Pembaca Sudah Selesai Membaca Maka Keluar Dari Program
            break ;
        } else {
            # Informasi Status Saat Ini
            $arrLagiBaca = array() ;
            foreach ($Antrian as $Pembaca => $AntrianSaatIni) {
                # Jika Sudah Ada Pembaca Selesai Maka Antrian Dikosongkan Untuk Pembacaan Selanjutnya
                if (isset($Antrian[$Pembaca])) {
                    if ($Antrian[$Pembaca]->isRunning() === false) {
                        # Jika Pembaca Sudah Selesai Baca Buku, Maka Antrian Dihapus
                        if ($Antrian[$Pembaca]->join()) {
                            $RangkumanSemua[] = $Antrian[$Pembaca]->rangkuman ;
                            unset($Antrian[$Pembaca]) ;
                        }
                    }
                }
                if (isset($Antrian[$Pembaca])) {
                    $arrLagiBaca[] = $Pembaca . " Saat Ini Sedang Baca '" . $Antrian[$Pembaca]->arg['buku'] . "'";
                }
            }
            if (count($arrLagiBaca) > 0) {
                if (count($AntrianBuku) > 0) {
                    $text = "\nMasih Ada ".count($AntrianBuku)." Belum Dibaca Dan Pembaca :\n - " . implode("\n - ", $arrLagiBaca) . "\n\n" ;
                } else {
                    $text = "\nAntrian Buku Sudah Habis Dan Pembaca :\n - " . implode("\n - ", $arrLagiBaca) . "\n\n" ;
                }
            } else {
                if (count($AntrianBuku) > 0) {
                    $text = "\nMasih Ada ".count($AntrianBuku)." Belum Dibaca\n\n" ;
                } else {
                    $text = "\nAntrian Buku Sudah Habis\n\n" ;
                }
            }
            if ($text != $prevText) {
                print "$text" ;
            }
            $prevText = $text ;
        }
        usleep(1000) ;
    }
   
    # Cetak Hasil Rangkuman Masing-Masing Pembaca
    foreach ($RangkumanSemua as $Rangkuman) {
        print "-> $Rangkuman\n" ;
    }
?>

Setelah dijalankan di PHP CLI, tampilannya kurang lebih akan seperti ini :

























Penjelasan programnya adalah saya membuat sebuah proses antrian untuk membaca 10 buku oleh 3 orang pembaca, namun siapa yang sudah selesai boleh langsung lanjut membaca buku selanjut tanpa harus menunggu yang lainnya selesai terlebih dahulu.

Jadi awalnya saya menyiapkan data 10 buku dan 3 pembaca :
$AntrianBuku = array('Bobo','Donal Bebek','Doraemon','Kungfu Boy','Dragon Ball','Harry Potter','Hunger Games','Miki Tikus','Peter Pan','Dongeng') ;
$SemuaPembaca = array('Diana','Robin','Hendi') ;

Kemudian melalui perulangan yang tidak akan berhenti kecuali semua buku telah terbaca, maka thread induk setiap saat akan melakukan pengecekan ke pembaca yang membaca. Jika sedang tidak membaca dan buku masih ada, makan akan di-assign untuk membaca buku.

if (!isset($Antrian[$Pembaca])) {
    if (count($AntrianBuku) > 0) {
        $bukuSaatIni = array_shift($AntrianBuku) ;
        $Antrian[$Pembaca] = new BacaBuku(array('nama' => $Pembaca, 'buku' => $bukuSaatIni)) ;
        $Antrian[$Pembaca]->start() ;
    }
}

Di sini, Kita membuat sebuah thread baru dan langsung menyuruhnya membaca dengan fungsi Thread->start().


Sembari mengecek apakah sudah ada pembaca yang sudah selesai baca, dan disimpan hasil rangkumannya dengan koding di bawah ini :

foreach ($Antrian as $Pembaca => $AntrianSaatIni) {
    if (isset($Antrian[$Pembaca])) {
        if ($Antrian[$Pembaca]->isRunning() === false) {
            if ($Antrian[$Pembaca]->join()) {
                $RangkumanSemua[] = $Antrian[$Pembaca]->rangkuman ;
                unset($Antrian[$Pembaca]) ;
            }
        }
    }
}

Fungsi Thread->isRunning() di sini dimaksudkan untuk mengecek apakah fungsi Thread->run() di thread sudah selesai dijalankan atau belum, jika sudah selesai, maka thread tersebut akan digabungkan ke induk dengan fungsi Thread->join(), sehingga thread Induk bisa membaca data rangkuman dari Thread tersebut.


Informasi mengenai PHP Thread sendiri bisa dilihat di sini namun memang untuk PHP Thread ini dokumentasinya masih sangat sedikit sekali, dikarenakan Thread sendiri tidak populer di web programming, karena threading sendiri sudah di-handle sama web server seperti Apache.