【问题标题】:File write are serialized in PHP文件写入在 PHP 中序列化
【发布时间】:2017-01-05 10:45:05
【问题描述】:

我有一个脚本,我可以在其中创建一个新文件并构建一个 .CSV 文件

$name = $_POST['file_name'];
$file = fopen('path/to/file_'.$name.'.csv','w');
$line = '"first_value","second_value"'...;
fwrite($file, $line."\n");

此脚本嵌入在 MAMP 服务器网站中,因此用户可能会在浏览器中打开第一个选项卡并调用此脚本,然后在同一浏览器中打开第二个选项卡并并行启动相同的脚本。我所期望的是,由于两个文件不同,文件写入应该并行完成,但情况恰恰相反:

它等待第一次写入完成,然后开始创建第二个文件。

我该如何解决这个问题?

【问题讨论】:

  • PHP 是单线程的!还有更合适的方法来创建 CVS 文件。 php.net/manual/en/function.fputcsv.php
  • @Justinas - 虽然每个单独的请求都应该在自己的线程中运行
  • 你是如何验证你的假设的?
  • @DanFromGermany 我正在创建的 CSV 文件需要几秒钟才能完成(例如 2.000.000 行),因此如果要并行创建,则应创建两个文件(开头为空)和然后每一个都填满;但是只有在第一个 CSV 完成时才创建第二个 CSV(空)...
  • @Justinas 是的,但我希望浏览器的每个选项卡都是不同的线程,或者如果从选项卡中这是错误的,我可以从另一个选项卡访问变量

标签: php xampp mamp


【解决方案1】:

从 cmets 我得出以下结论。

  1. 当文件不相同时,PHP 等待第一个文件被写入是没有意义的。这将是另一种情况(“文件锁”)。

  2. 1234563 .

当尝试这样的事情时,您应该使用不同的计算机,或者将控制台与 curl 或 wget(或 PHP / bash 脚本!)结合使用,而不使用缓存。

【讨论】:

  • 是的,事实上为了避免这种情况我使用不同的浏览器,但我应该在大量并发访问上测试我的应用程序,事实上我可以使用浏览器就像 1 它是一个大问题:)
  • 我不知道 cURL 和 wget 但似乎它们实际上可以从服务器下载文件,而不是在服务器上创建它......或者也许有我知道的用途?
  • @FrankB。 “下载”的意思是“发出请求并在本地保存响应”。使用这些工具,您可以向为您创建文件的 URL 发出请求(客户端到服务器请求)。无需保存任何响应。
  • 但是当我在我的浏览器上运行一个 PHP 页面时,它是在服务器上运行,还是在我的机器上运行然后向服务器发送响应?
  • PHP 不在浏览器上运行,它在服务器上运行。浏览器发送请求,服务器响应响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多