Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在大型php应用程序中写入文件(多个问题)_Php_File_Append_Flock - Fatal编程技术网

如何在大型php应用程序中写入文件(多个问题)

如何在大型php应用程序中写入文件(多个问题),php,file,append,flock,Php,File,Append,Flock,在大型php应用程序中写入文件的最佳方式是什么。假设每秒需要大量写入。最好的办法是什么 我可以打开文件并附加数据吗。或者我应该打开、锁定、写入和解锁 处理文件和其他数据时会发生什么情况。此活动将丢失或保存。如果这将被保存,将停止应用程序 如果你曾经读过,谢谢你的阅读 如果并发是一个问题,那么您应该真正使用数据库。使用 如果您只需要追加数据,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,你是说附件是原子的吗?