向PHP发送邮件:文件内容未写入/提交顺序错误
我正在使用AngularHTTP将数据从我的Ionic应用程序发布到PHP脚本。在该脚本中,一个json文件被读取和解码,因此传入的数据可以被追加,然后写回该文件 这基本上可以正常工作,但在某些情况下,向PHP发送邮件:文件内容未写入/提交顺序错误,php,angular,http,post,file-put-contents,Php,Angular,Http,Post,File Put Contents,我正在使用AngularHTTP将数据从我的Ionic应用程序发布到PHP脚本。在该脚本中,一个json文件被读取和解码,因此传入的数据可以被追加,然后写回该文件 这基本上可以正常工作,但在某些情况下,文件内容不会写入新的编码数组和/或提交顺序混乱 类型脚本: this.names.forEach(name => { this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: nam
文件内容
不会写入新的编码数组和/或提交顺序混乱
类型脚本:
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
$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
}
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
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"
}
]"
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"
}
]"
键入脚本发布数据:
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
$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
}
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
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"
}
]"
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"
}
]"
PHP脚本:
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
$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
}
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
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"
}
]"
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"
}
]"
names.json在任何写入之前(初始状态):
names.json发布完成后:
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
$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
}
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
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"
}
]"
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"
}
]"
该文件有777个权限,在此过程中未打开。如您所见,只写入了一个名称,插入了一个null,然后什么也没有发生
当我查看Chrome网络标签时,我注意到在用户1(其漂亮的json打印看起来不错)之后,订单就乱了。用户1之后是用户3,但是file\u get\u contents(names.json)
返回了空数组,因此用户1实际上没有被写入。用户3也生成了正确的json,但在这之后,用户2出现了,并且file\u get\u contents('names.json')
是空的(如空字符串),因此它停止在这里
然而,我不明白为什么在所有这些之后,文件中仍然有用户1,以及为什么其他两个不是一般编写的
以下是Chrome网络选项卡中的我的var_dumps():
用户1(第一):
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
$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
}
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
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"
}
]"
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"
}
]"
用户3(秒!?):
this.names.forEach(name => {
this.http.post("http://myServer.test/saveNames.php", {name: name["name"], mode: name["mode"]}).subscribe(
err => {
errors.push(name["name"]);
}
);
});
(3) [{…}, {…}, {…}]
0: {name: "User 1", mode: "namesM"}
1: {name: "User 2", mode: "namesW"}
2: {name: "User 3", mode: "namesJobs"}
length: 3
$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
}
[
{
"name": "User 1",
"mode": "namesM"
},
null
]
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"
}
]"
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(第三!?)
我真的很抱歉这么长的文字,但我只是在尝试了几个小时后找不到解决办法。我希望我记录的足够好,谢谢你的帮助 在我看来,这两个问题都可能发生:
LOCK\u EX
标志的file\u put\u contents和file\u get\u contents以独占方式读取和写入文件。看磁盘操作非常慢,因此您不应该指望它们跟上来自客户端的请求。您应该尽可能少地执行磁盘操作,并在执行操作时尽量多地批处理数据。我没有一个可以测试这一点的环境,但我要冒险猜测一下,您的TypeScript正在为
名称中的每个项目向PHP脚本发送post请求,并且它收到的每个请求,它正在覆盖以前的数据。尝试将FILE\u APPEND
添加到FILE\u put\u contents
作为第三个参数,看看这是否解决了问题。不过我可能会走得很远,让我知道事情进展如何=)