多進程同時修改一個文件是很容易造成這樣的情況,建議使用數據庫來存儲,編程就非常簡單,鎖可以細到記錄級。
創新互聯于2013年創立,先為龍海等服務建站,龍海等地企業,進行企業商務咨詢服務。為龍海企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
如果必須使用文件,一般的辦法是讀文件前判斷是否存在臨時文件,存在就放棄(或者等待),只有不存在臨時文件才繼續操作,繼續操作的第一步是建立臨時文件,修改文件,最后刪除臨時文件。
利用WEB服務器本身的多線程來處理,從WEB服務器多次調用我們需要實現多線程的程序。
PHP中也能多線程了,那么問題也來了,那就是同步的問題。
安徽電腦培訓知道PHP本身是不支持多線程的,所以更不會有什么像Java中synchronize的方法了。
那我們該如何做呢?1.盡量不訪問同一個資源。
以避免沖突。
但是可以同時像數據庫操作。
因為數據庫是支持并發操作的。
所以在多線程的PHP中不要向同一個文件中寫入數據。
如果必須要寫的話,用別的方法進行同步。
如調用flock對文件進行加鎖等。
或建立臨時文件,并在另外的線程中等待這個文件的消失while(file_exits('xxx'));這樣就等于這個臨時文件存在時,表示其實線程正在操作。
如果沒有了這個文件,說明其它線程已經釋放了這個。
2.盡量不要從runThread在執行fputs后取這個socket中讀取數據。
因為要實現多線程,需要的用非阻塞模式。
即在像fgets這樣的函數時立即返回。
。
所以讀寫數據就會出問題。
如果使用阻塞模式的話,程序就不算是多線程了。
他要等上面的返回才執行下面的程序。
所以如果需要交換數據最后利用外面文件或數據中完成。
實在想要的話就用socket_set_nonblock($fp)來實現。
說了這么多,倒底這個有沒有實際的意義呢?在什么時候需要這種用這種方法呢?答案是肯定的。
大家知道。
在一個不斷讀取網絡資源的應用中,網絡的速度是瓶頸。
如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。
/*
*flock(file,lock,block)
*file 必需,規定要鎖定或釋放的已打開的文件
*lock 必需。規定要使用哪種鎖定類型。
*block 可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。
*lock
*LOCK_SH 要取得共享鎖定(讀取的程序)
*LOCK_EX 要取得獨占鎖定(寫入的程序)
*LOCK_UN 要釋放鎖定(無論共享或獨占)
*LOCK_NB 如果不希望 flock() 在鎖定時堵塞
/*
if (flock($file,LOCK_EX))
{
fwrite($file,'write more words');
flock($file,LOCK_UN);
}
else
{
//處理錯誤邏輯
}
fclose($file);
)
(1)下載后得到php-5.1.2-Win32.zip,解壓至C:\php(這個路徑可以隨意,不過下面要是用到這個路徑,請相應修改);(2)再將C:\php\libmysql.dll和C:\Inetpub\php\ext\php_mysql.dll復制到C:\Windows\system32下;(3)將C:\PHP\php.ini-dist復制到C:\Windows(Windows2000下為C:\WINNT)并將改名為php.ini,然后用記事本打開,利用記事本的查找功能搜索:extension_dir="C:\PHP\ext"將其路徑指到你的PHP目錄下的extensions目錄,比如:extension_dir="C:\Inetpub\php\ext";搜索;WindowsExtensions并僅打開需要的模塊以節省內存(去掉每個模塊前的;號即可):extension=php_gd2.dllGD庫支持,如果不打開該模塊則Discuz!論壇圖片水印不能使用。extension=php_mbstring.dll為了支持phpMyAdmin,打開mbstring。extension=php_mysql.dll不用說了吧,支持MySQL。首先必須確定系統中已經正確安裝IIS,如果沒有安裝,需要先安裝IIS。PHP與IIS整合時支持CGI和ISAPI兩種模式,推薦使用ISAPI模式。這里只解介紹ISAPI模式安裝方法:ISAPI模式安裝步驟:在“控制面板”的“管理工具”中選擇“Internet服務管理器”,打開IIS后停止服務,然后在左側“你需要支持PHP的Web站點上單擊右鍵選擇“屬性”,在打開的“Web站點屬性”窗口的“ISAPI篩選器”標簽里找到并點擊“添加”按鈕,在彈出的“篩選器屬性”窗口中的“篩選器名稱”欄中輸入:PHP,再將可執行文件指向php5isapi.dll所在路徑,如:C:\PHP\php5isapi.dll。打開“Web站點屬性”窗口的“主目錄”標簽,找到并點擊“配置”按鈕,在彈出的“應用程序配置”窗口中找到并點擊“添加”按鈕,在彈出的窗口中新增一個擴展名映射,擴展名為.php,單擊“瀏覽”將可執行文件指向php5isapi.dll所在路徑,如:C:\PHP\php5isapi.dll,然后一路確定即可。確定Web目錄的應用程序設置和執行許可中選擇為純腳本,然后關閉Internet信息服務管理器,在命令提示符中執行如下命令:netstopw3svcnetstopiisadminnetstartw3svc然后在“Internet服務管理器”左邊的“WEB服務擴展”中設置ISAPI擴展允許,ActiveServerPages允許
#!/usr/bin/env?php
?php
$cmds=array(
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',2)
);
foreach($cmds?as?$cmd){
$pid=pcntl_fork();
if($pid==-1){?//進程創建失敗
die('fork?child?process?failure!');
}
else?if($pid){?//父進程處理邏輯
pcntl_wait($status,WNOHANG);
}
else{?//子進程處理邏輯
pcntl_exec('/usr/local/bin/php',$cmd);
}
}
盡可能的使用html,靜態頁面去完成。 環境上,可以使用nginx+apache+php+mysql 組合。目前大型網站基本都是使用php語言去寫。 數據庫需要專業優化結果,做好字段索引等 服務器帶寬上,也需要非常高的要求。這個不是一下子都能說清楚的。
網頁名稱:php多進程操作數據庫,php怎么啟動多個進程
鏈接URL:http://m.kartarina.com/article18/heihdp.html
成都網站建設公司_創新互聯,為您提供品牌網站建設、商城網站、網站維護、面包屑導航、App設計、全網營銷推廣
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯