1. 程式人生 > >PHP之pthread拓展使用以及坑

PHP之pthread拓展使用以及坑

一. 執行緒的建立和使用

1. Thread類

基本的建立和使用:

<?php
//通過繼承Thread類來實現自己的執行緒類MyThread
class MyThread extends Thread{
    //重寫建構函式
    function __construct(){
    }
    //重寫run方法(執行的是子執行緒需要執行的任務)
    function run(){
    }
}

//物件的例項化和執行就和java一樣
$mt = new MyThread();
$mt->start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

當然,作為執行緒類,必須還有另外一些用於查詢執行緒狀態以及管理執行緒的方法

<?php
//獲取建立執行緒的父執行緒id
Thread::getCreatorId 
//獲取當前執行緒id
Thread::getCurrentThreadId
//獲取當前執行緒引用
Thread::getCurrentThread 
//將執行緒加入檢測
Thread::join
//檢視執行緒是否被檢測(是否被join)
Thread::isJoined
//強行殺死執行緒
Thread::kill
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.Worker類

Worker類的父類是Thread類,因此基本用法和Thread一樣。而Worker類相對於Thread類來說,增加了執行緒複用的功能(以降低建立銷燬執行緒所耗費的資源

),通常與Stackable類連用,也就是說worker類既可以當做執行緒使用,也可以當做任務的容器來使用,如:

<?php
class Task extends Stackable{

    function __construct($no){
        $this->no = $no;
    }

    function run(){
        echo "task{$this->no}:run".PHP_EOL;

    }
}

class MyWork extends Worker{

    function __construct(){

    }

    function
run(){
} } $t1= new Task(1); $t2= new Task(2); $t3= new Task(3); $my = new MyWork(); $my->stack($t1); $my->stack($t2); $my->start(); $my->stack($t3);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

最終輸出:

task1:run
task2:run
task3:run
  • 1
  • 2
  • 3

當然Worker類還有其他一些方法來用於父執行緒對其進行管理

//獲取還沒執行的任務數量
Worker::getStacked 
//判斷worker是否關閉
Worker::isShutdown
//判斷worker是否在工作
Worker::isWorking
//關閉銷燬worker
Worker::shutdown
//將任務壓棧
Worker::stack
//將任務出棧(該api有問題,慎用)
Worker::unstack
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二. PHP執行緒遇到的一些問題與注意點

1.執行緒類的屬性不能直接進行雜湊表(陣列)操作,如:

//這樣是無效的
$this->var1["hello"] = "world"; 
//改為
$this->var1 = ["hello"=>"world"];
  • 1
  • 2
  • 3
  • 4

為什麼?因為執行緒類屬性的賦值是通過序列化實現的,其本質是儲存了序列化資料,因此不支援PHP常用直接操作雜湊表(陣列)的操作。

2.執行緒類的屬性不能是“閉包函式”

原因:閉包函式不能序列化;因此,如果想線上程裡用“回撥函式”的話,那就放棄執行緒吧;

3.執行緒物件開闢了php的第二空間

(1)執行緒在建立之後,無法訪問到父執行緒的變數,諸如$GLOBALS或global等用法都無法操作父執行緒的全域性變數,這應該是考慮到了執行緒安全的問題; 
(2)但是父執行緒卻能夠訪問子執行緒物件的內容;

相關推薦

PHPpthread拓展使用以及

一. 執行緒的建立和使用 1. Thread類 基本的建立和使用: <?php //通過繼承Thread類來實現自己的執行緒類MyThread class MyThread extends Thread{ //重寫建構函式 function __construct(){

初學PHP echo/print 以及資料型別

與echo相同; PHP的資料型別; 相對於js中的六大基本資料型別:String(字串)、Number(數字)、Boolean(布林值)、Array(陣列)、Object(物件)、Null(空);PHP將數字又分為整型與浮點型;即PHP有七大資料基本型別:String(字串)、Integer(整型)、Fl

PHP那些年我們踩過的

PHP之那些年我們踩過的坑 1、由於使用單引號,以“ ”為分割符,使用PHP函式explode分割字串,不能正常分割。 原因:這個涉及到單引號與雙引號的區別,在單引號中反斜槓不能被解析。因此,使用explode分割時,如果使用單引號, 會被當作字串,而不是換行符,所以此時,不能正常分

mui ajax遇到的 後臺接受資料為空 後端服務為php

mui.ajax的官方模板為             mui.ajax(Host+'/app/index/newsinfo',{                 data:{id:newsId},                 dataType:'json',//伺服器返回

php函式 Trim 用法以及使用注意點

 trim      – 去除字串首尾處的空白字元(或者其他字元)  ltrim     – 刪除字串開頭的空白字元(或其他字元)  rtrim     – 刪除字串末端的空白字元(或者其他字元) 該函式區分大小寫 此函式返回字串 str 去除首尾空白字元後的結果。如

PHP(以此記錄,下次可繞開)

最近在接手一個php專案時遇到了很多坑,其中這些坑尤為深,特別是對於那些只看了幾下語法就開始戰鬥的同志們來說尤其要注意:1)PHP對程式碼檔案的字首字元非常敏感,不能有BOM頭,比如很多文字編輯(包括記事本)在儲存為utf-8字元格式時會加入兩個位元組,以標明身份,但這個對於

phpclone 複製物件以及__clone魔術方法

如果錯誤和不足請給予指出,謝謝~ (⊙_⊙) 在開始使用clone之前我們下先看以下一個小例子: <?php //首先定義一個test一個類 class Testclass { //成員變數是$value1 public $va

PHP新手自學基礎知識(六)——拓展名稱空間

名稱空間概述 什麼是名稱空間?從廣義上來說,名稱空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在作業系統中目錄用來將相關檔案分組,對於目錄中的檔案來說,它就扮演了名稱空間的角色。具體舉個例子,檔案foo.txt 可以同時在目錄/home/g

PHP連接mysql小練習

eset logs int echo mod reg title htm cal mysql Test.sql 1 -- phpMyAdmin SQL Dump 2 -- version 4.6.6 3 -- https://www.phpmyadmin.net/

php路--半年

之路 現在 那是 繼續 感慨 進步 公司 都沒有 沒有 寶寶是2016.08.16開始自選php網絡課程,倆月後順利入職。感覺很幸運!10.19是上班的第一天,感覺萌萌噠!說一下,我是轉行過來的還是蠻高興滴。入職三月感覺一臉懵逼樣,什麽都不會,想到是半路出家。好吃虧,什

多線程pthread, NSThread, NSOperation, GCD

read 技術 線程的生命周期 難度 利用 功能 替換 nop 簡單 關於多線程會有一系列如下:多線程之概念解析 多線程之pthread, NSThread, NSOperation, GCD 多線程之NSThread 多線程之NSOperation 多線程之GCD pt

前端學PHP自定義模板引擎

php什麽是網站模板?準確地說,是指網站頁面模板,即每個頁面僅是一個板式,包括結構、樣式和頁面布局,是創建網頁內容的樣板,也可以理解為已有的網頁框架。可以將模板中原有的內容替換成從服務器端數據庫中動態內容,目的是可以保持頁面風格一致  PHP是一種HTML內嵌式的在服務器端執行的腳本語言,所以大部分PHP開發

PHP錯誤處理

php錯誤報告  PHP程序的錯誤發生一般歸屬於下列三個領域:  1、語法錯誤  語法錯誤最常見,並且也容易修復。如:代碼中遺漏一個分號。這類錯誤會阻止腳本的執行  2、運行時錯誤  這種錯誤一般不會阻止PHP腳本的執行,但會阻止當前要做的事情。輸出一條錯誤,但php腳本繼續執行  3、邏輯錯誤  這種錯誤最

前端學PHP正則表達式基礎語法

版本 得到 則表達式 特性 邊界 包括 報錯 正則表達式基礎 性能提升 前面的話   正則表達式是用於描述字符排列和匹配模式的一種語法規則。它主要用於字符串的模式分割、匹配、查找及替換操作。在PHP中,正則表達式一般是由正規字符和一些特殊字符(類似於通配符)聯合構成的一個文

前端學PHP日期與時間

[0 asc end span print 並且 something 信息 tab 前面的話   在Web程序開發時,時間發揮著重要的作用,不僅在數據存儲和顯示時需要日期和時間的參與,好多功能模塊的開發,時間通常都是至關重要的。網頁靜態化需要判斷緩存時間、頁面訪問消耗的時間

PHP路——geohash查找附近的人

之路 number value php code fun () oca -1 <?php class location { public function getLat($number, $small, $big, $temp = 20){ $temp-

程序中的文件沙盒以及plist文件的初步使用

ice b2c ng- 可見 ngs 函數 用戶 nsdata nss 沙盒是相對於“應用程序”的文件,也就是相相應app所在的頁面的文件。 每個應用都有自己的應用沙盒(應用沙盒就是文件系統文件夾)。與其它文件系統隔離。應用必須呆在在積極的沙盒中。其它的應用不可以訪問沙

php將用戶信息寫入數據庫

顯示 更新 post blog 鏈接 -m .net 靜態 延遲 session高級應用將用戶信息寫入到數據庫中 首先建立數據庫表 在實驗數據庫sqldb中建立session表,用於存儲數據 在根文件夾下建立須要用到的文件(重點是session,class.ph

前端學PHP面向對象系列第五篇——對象操作

fas get toolbar 影響 運算 描述 ssa reference 保持 對象克隆   對象復制,又叫對象克隆,可以通過 clone 關鍵字來完成   在多數情況下,我們並不需要完全復制一個對象來獲得其中屬性。但有一個情況下確實需要:如果你有一個窗口對象,該對象持

php 查詢 投票練習0508

sheng rms svm rem ins jieba ngx nor au3 %E4%BD%BF%E7%94%A8LIBSVM%E5%B7%A5%E5%85%B7%E5%AE%9E%E7%8E%B0%E6%A0%B7%E6%9C%AC%E5%88%86%E7%B1%BB%