如何在大型php应用程序中写入文件(多个问题)
在大型php应用程序中写入文件的最佳方式是什么。假设每秒需要大量写入。最好的办法是什么 我可以打开文件并附加数据吗。或者我应该打开、锁定、写入和解锁 处理文件和其他数据时会发生什么情况。此活动将丢失或保存。如果这将被保存,将停止应用程序如何在大型php应用程序中写入文件(多个问题),php,file,append,flock,Php,File,Append,Flock,在大型php应用程序中写入文件的最佳方式是什么。假设每秒需要大量写入。最好的办法是什么 我可以打开文件并附加数据吗。或者我应该打开、锁定、写入和解锁 处理文件和其他数据时会发生什么情况。此活动将丢失或保存。如果这将被保存,将停止应用程序 如果你曾经读过,谢谢你的阅读 如果并发是一个问题,那么您应该真正使用数据库。使用 如果您只需要追加数据,PHP应该可以,因为文件系统应该负责同时追加数据。我有一个高性能的多线程应用程序,其中所有线程都在向单个日志文件写入(追加)数据。到目前为止,我并没有注意到任
如果你曾经读过,谢谢你的阅读 如果并发是一个问题,那么您应该真正使用数据库。使用
如果您只需要追加数据,PHP应该可以,因为文件系统应该负责同时追加数据。我有一个高性能的多线程应用程序,其中所有线程都在向单个日志文件写入(追加)数据。到目前为止,我并没有注意到任何问题,每个线程每秒写入多次,并且不会丢失任何内容。我认为仅仅附加到一个大文件应该没有问题。但是如果你想修改已经存在的内容,特别是并发内容,我会选择锁定,否则会发生大混乱…下面是一个简单的例子,强调了同时使用智能的危险:
<?php
for($i = 0; $i < 100; $i++) {
$pid = pcntl_fork();
//only spawn more children if we're not a child ourselves
if(!$pid)
break;
}
$fh = fopen('test.txt', 'a');
//The following is a simple attempt to get multiple threads to start at the same time.
$until = round(ceil(time() / 10.0) * 10);
echo "Sleeping until $until\n";
time_sleep_until($until);
$myPid = posix_getpid();
//create a line starting with pid, followed by 10,000 copies of
//a "random" char based on pid.
$line = $myPid . str_repeat(chr(ord('A')+$myPid%25), 10000) . "\n";
for($i = 0; $i < 1; $i++) {
fwrite($fh, $line);
}
fclose($fh);
echo "done\n";
如果您只是在编写日志,可能需要查看syslog函数,因为它提供了一个api。
您还应该将写操作委托给专用后端,并在异步管理器中执行此操作?这些是我的2p
除非出于特定原因需要一个唯一的文件,否则我会避免将所有内容附加到一个大文件中。相反,我将按时间和维度包装文件。可以为此定义几个配置参数(wrap_time和wrap_size)
此外,我可能会引入一些缓冲,以避免等待写入操作完成
PHP可能不是最适合这种操作的语言,但它仍然是可能的。我正在写一个日志文件。如果对数据库的写入已经很重,那么对于日志文件,我只想写入文件。文件也应该是并发的。标准的linux文件系统肯定不会“注意”同时添加的附件。举一个简单的例子来说明为什么会这样,想象一下:两个进程在几毫秒内打开同一个文件,并以每秒100兆的速度追加一千兆的数据,这意味着每个进程的写入时间为10秒。文件系统如何确保写入不会重叠?它是否应该将第二个进程的数据缓冲到第一个进程完成?好吧,因为您使用了一个非常荒谬的例子,我只想说:PHP无法每秒追加100兆,它也无法处理这些数据。虽然,对于这样的假设情况,你可能是正确的,但现实是另一回事,正如上面所描述的,附加只是起作用。吃吧。发布了一个简单的真实例子,展示了多个同时发生的附件相互碰撞+1.我每天都会在apache访问日志中看到重叠的条目,因此在高负载下肯定会发生一些丢失。但是对于一个日志文件来说,被破坏的几行实际上并不重要,它们当然不值得文件锁定的开销。@Laimoncijus,你是说附件是原子的吗?