gpt4 book ai didi

php - stream_set_write_buffer 或 PHP 中的文件锁定?

转载 作者:可可西里 更新时间:2023-10-31 23:39:08 29 4
gpt4 key购买 nike

我正在尝试制作一个可以尽可能快地写入大量数据(8 KB 到 200 KB 之间)的缓存系统。

目前我正在使用类似于以下的代码来应用文件锁定功能:

$file_handle=fopen($file_name,"w");
flock($file_handle,LOCK_EX);
fwrite($file_handle,$all_data);
flock($file_handle,LOCK_UN);
fclose($file_handle);

如果多个进程同时运行同一个脚本,这是一次只允许一个进程写入文件的最佳速度方式吗?还是我还应该包括 stream_set_write_buffer($file_handle,0); 还是我应该放弃文件锁定?

最佳答案

简而言之:

file_put_contents($file_name, $all_data, LOCK_EX);

长话短说:您的代码存在一个问题:“w”模式在获取锁之前截断文件。如果两个单独的进程截断了一个文件,一个写入 200Kb,另一个写入 8Kb,那么文件中将留下 192Kb 的垃圾。我建议以“c”模式打开一个文件,并在写入所有数据后最后截断它:

$file_handle = fopen($file_name, 'c');
stream_set_write_buffer($file_handle, 0); // try to disable write buffering
flock($file_handle, LOCK_EX);
fwrite($file_handle, $all_data); // write to possibly pre-allocated space
ftruncate($file_handle, strlen($all_data)); // remove gabage left from previous write
fflush($file_handle); // flush write buffers if enabled
flock($file_handle, LOCK_UN);
fclose($file_handle);

'c' Open the file for writing only. If the file does not exist, it is created. If it exists, it is neither truncated (as opposed to 'w'), nor the call to this function fails (as is the case with 'x'). The file pointer is positioned on the beginning of the file. This may be useful if it's desired to get an advisory lock (see flock()) before attempting to modify the file, as using 'w' could truncate the file before the lock was obtained (if truncation is desired, ftruncate() can be used after the lock is requested).

您需要通过调用 fflush() 或禁用写入缓冲来确保在释放锁定之前刷新写入缓冲区。由于 stream_set_write_buffer(); 可能会失败,因此最好还是使用 fflush()。另请注意,写缓冲旨在提高顺序写入的性能。由于您只执行一次写入操作,写入缓冲区会略微降低性能,因此最好先尝试禁用它。

关于php - stream_set_write_buffer 或 PHP 中的文件锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711049/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com