flock — 轻便的咨询文件锁定
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
handle
文件系统指针,是典型地由 fopen() 创建的 resource (资源)。
operation 可以是以下值之一:
1. LOCK_SH 取得共享锁定(读取的程序)。
2. LOCK_EX 取得独占锁定(写入的程序。
3. LOCK_UN 释放锁定(无论共享或独占)。
4.如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB (Windows 上还不支持)。
wouldblock
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE 。(Windows 上不支持)
返回值
成功时返回 TRUE , 或者在失败时返回 FALSE 。
在 PHP 5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会自动调用),现在要解锁必须手动进行( flock ( $fp , LOCK_UN );// 释放锁定)。
当用一个多线程服务器 API(比如 ISAPI)时,可能不可以依靠 flock() 来保护文件,因为运行于同一服务器实例中其它并行线程的 PHP 脚本可以对该文件进行处理。(?)
eg:1
file_get_contents 和 file 有时读取一非空文件时返回空,如下例
code1锁定期间,code2输出的都是空,code3会等待code1释放锁定后返回获取的内容
code1
<?<span>php </span><span>$fo</span> = <span>fopen</span>('abc.txt', 'r+'<span>); </span><span>flock</span>(<span>$fo</span>,<span> LOCK_EX); </span><span>sleep</span>(10<span>); </span><span>flock</span>(<span>$fo</span>, LOCK_UN);
code2
<?<span>php </span><span>var_dump</span>(<span>file_get_contents</span>('abc.txt'<span>)); </span><span>var_dump</span>(<span>file</span>('abc.txt'));
code3
<?<span>php </span><span>$con</span> = getContents('abc.txt'<span>); </span><span>print_r</span>(<span>$con</span><span>); </span><span>function</span> getContents(<span>$path</span>, <span>$waitIfLocked</span> = <span>true</span><span>) { </span><span>if</span>(!<span>file_exists</span>(<span>$path</span><span>)) { </span><span>throw</span> <span>new</span> <span>Exception</span>('File "'.<span>$path</span>.'" does not exists'<span>); } </span><span>else</span><span> { </span><span>$fo</span> = <span>fopen</span>(<span>$path</span>, 'r'<span>); </span><span>$locked</span> = <span>flock</span>(<span>$fo</span>, LOCK_SH, <span>$waitIfLocked</span><span>); </span><span>if</span>(!<span>$locked</span><span>) { </span><span>return</span> <span>false</span><span>; } </span><span>else</span><span> { </span><span>$cts</span> = <span>file_get_contents</span>(<span>$path</span><span>); </span><span>flock</span>(<span>$fo</span>,<span> LOCK_UN); </span><span>fclose</span>(<span>$fo</span><span>); </span><span>return</span> <span>$cts</span><span>; } } } </span>
eg:2
本机运行结果和下面的不一致,LOCK_SH时能写入(???)
下面的是手册上的例子
I just spend a long time to understand why write function returns me "0", on a basic file opening and then writing.
I discovered that if you use LOCK_SH and then you write something, that will not work :
<?<span>php </span><span>$fp</span> = <span>fopen</span>('file.txt', 'a'<span>); </span><span>flock</span>(<span>$fp</span>,<span>LOCK_SH); </span><span>$written</span> = <span>fputs</span>(<span>$fp</span>, 'data'<span>); </span><span>var_dump</span>(<span>$written</span>); <span>//</span><span> 0 and file is not changed</span> <span>fclose</span>(<span>$fp</span>);
eg:3
写代码来解决多进程线程同时读写一个文件的问题:
PHP是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。
简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,
该文件是被锁定的,其他用户只能等待,确实不够完美,但是也可以满足一些要求不高的应用
<?<span>php </span><span>function</span> T_put(<span>$filename</span>,<span>$string</span><span>){ </span><span>$fp</span> = <span>fopen</span>(<span>$filename</span>,’a'<span>); //追加方式打开 if (flock($fp, LOCK_EX)){ //加写锁 fputs($fp,$string); //写文件 flock($fp, LOCK_UN); //解锁 } fclose($fp); } function T_get($filename,$length){ $fp = fopen($filename,’r</span>'); <span>//</span><span>追加方式打开 </span> <span>if</span> (<span>flock</span>(<span>$fp</span>, LOCK_SH)){ <span>//</span><span>加读锁 </span> <span>$result</span> = <span>fgets</span>(<span>$fp</span>,<span>$length</span>); <span>//</span><span>读取文件 </span> <span>flock</span>(<span>$fp</span>, LOCK_UN); <span>//</span><span>解锁 </span> <span>} </span><span>fclose</span>(<span>$fp</span><span>); </span><span>return</span> <span>$result</span><span>; }</span>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。
