- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 angular http 将数据从我的 Ionic 应用程序发布到 PHP 脚本。在该脚本中,一个 json 文件被读取和解码,以便可以附加传入的数据,然后将其写回到文件中。
这基本上可以正常工作,但在某些情况下 file_put_contents
不会写入新的编码数组和/或提交顺序被弄乱了。
typescript :
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
Typescript 发布数据:
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
PHP 脚本:
$postData = file_get_contents("php://input");
if (isset($postData)) {
$request = json_decode($postData, true);
var_dump("Data after decode:");
var_dump($request);
$inp = file_get_contents('names.json');
if (($inp) == "") return; // Return so file does not get messed up
$allNames = json_decode($inp, true);
var_dump("File, no decode:");
var_dump($inp);
var_dump("File, decoded:");
var_dump($allNames);
$allNames[] = $request;
var_dump("File content + new data:");
var_dump($allNames);
var_dump("All data pretty printed:");
var_dump(json_encode($allNames, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
file_put_contents('names.json', json_encode($allNames, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); // mit UTF8s
}
names.json 在任何写入之前(初始状态):
[]
发布完成后的 names.json:
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
该文件具有 777 权限,并且在此过程中未打开。如您所见,只写了一个名字,插入了一个空值,然后什么也没有发生。
当我检查 Chrome 网络选项卡时,我注意到在用户 1(其 pretty-print json 看起来不错)之后,订单被弄乱了。在 User 1 之后,接下来是 User 3,但是 file_get_contents(names.json)
返回的是空数组,因此实际上并没有写入 User 1。用户 3 也产生了正确的 json,但之后用户 2 紧随其后,file_get_contents('names.json')
为空(如空字符串),因此它在此处停止。
但是我不明白为什么文件中仍然有用户 1,为什么其他两个没有写成一般。
这是 Chrome 网络选项卡中的 var_dumps():
用户 1(第一个):
string(18) "Data after decode:"
array(2) {
["name"]=>
string(6) "User 1"
["mode"]=>
string(6) "namesM"
}
string(16) "File, no decode:"
string(2) "[]"
string(14) "File, decoded:"
array(0) {
}
string(24) "File content + new data:"
array(1) {
[0]=>
array(2) {
["name"]=>
string(6) "User 1"
["mode"]=>
string(6) "namesM"
}
}
string(24) "All data pretty printed:"
string(66) "[
{
"name": "User 1",
"mode": "namesM"
}
]"
用户 3(第二个!?):
string(18) "Data after decode:"
array(2) {
["name"]=>
string(6) "User 3"
["mode"]=>
string(9) "namesJobs"
}
string(16) "File, no decode:"
string(2) "[]"
string(14) "File, decoded:"
array(0) {
}
string(24) "File content + new data:"
array(1) {
[0]=>
array(2) {
["name"]=>
string(6) "User 3"
["mode"]=>
string(9) "namesJobs"
}
}
string(24) "All data pretty printed:"
string(69) "[
{
"name": "User 3",
"mode": "namesJobs"
}
]"
用户 2(第三个!?)
string(18) "Data after decode:"
array(2) {
["name"]=>
string(6) "User 2"
["mode"]=>
string(6) "namesW"
}
对于冗长的文字,我真的很抱歉,但我尝试了几个小时后还是找不到解决方案。我希望我记录得足够好,感谢您的帮助!
最佳答案
在我看来,这些问题中的任何一个都可能发生:
您运行 PHP 的网络服务器可能正在并行(多线程)运行每个 POST 请求,这会导致文件部分打开或忙于由一个请求写入,而另一个请求正忙于尝试写入阅读它。
您的网络服务器的文件系统告诉 PHP 文件已写入且一切正常,而实际上,在实际将数据实际写入磁盘之前,它仍在忙于在内部缓存数据。因此,当下一个读取文件的请求到来时,它还没有完全写入。
因此您可能尝试的解决方案是:
尝试使用带有 LOCK_EX
标志的 file_put_contents 和 file_get_contents 来专门读取和写入文件。参见 http://php.net/manual/en/function.file-put-contents.php
为什么要从同一个客户端发送多个 POST 请求?你应该做这样的事情:
var allNames = [];
this.names.forEach(name => {
allNames.push({name: name["name"], mode: name["mode"]});
});
this.http.post("http://myServer.test/saveNames.php", allNames, ....);
所以一次发送整个名称数组,就可以避免遇到这个问题。
磁盘操作非常慢,因此您不应该指望它们跟上来自客户的请求。您应该只进行尽可能少的磁盘操作,并尽可能多地对数据进行批处理。
关于php - Angular POST 到 PHP : file_put_contents not writing/wrong submit order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54484278/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!