我有array
看起来像这样:
Daemon.php
$data = array(
'notificationId' => $notificationId,
'userId' => $userId,
'appId' => $appId,
'message' => $message,
'destinationUrl' => $destinationUrl,
'method' => $method,
'notificationTime' => $notificationTime,
'timeReceived' => $timeReceived,
'impressions' => $impressions,
'clicks' => $clicks,
'numberOfUsers' => $numberOfUsers,
'campaignId' => $campaignId,
'targetGroups' => $targetGroups,
'notificationType' => $notificationType,
'status' => $status,
'appGroup' => $appGroup
);
我正在通过exec
这样发送:
$data=json_encode($data);
exec("php path/where/script/is/useArray.php ".$data." &");
尝试在其他脚本上使用它:
useArray.php
$logData=$argv[1];
json_decode($logData);
为了查看useArray.php
上收到的数据,我将这个$logData
数组放入服务器上的txt文件中,如下所示:
file_put_contents(__DIR__ .'/log/testiranje.txt', print_r($logData,true)."\n", FILE_APPEND);
但发送json
似乎没有被正确解码。这就是$logData
在testiranje.txt
内的看法:
{notificationId:478,userId:92,appId:1512823699024883,message:joj,destinationUrl:https:\/\/www.servis-racunara.net\/pages\/,method:2}
所以这是我在做json_decode
之后得到的一些奇怪的类json格式。当然我不知道如何使用这种格式,因为我不能做任何事情:
$notificationId = $logData['notificationId'];
答案 0 :(得分:1)
您正在通过shell语法解释字符串,该语法具有自己非常大且复杂的特殊字符。例如,"
引号由shell解释,因此从结果值中删除。
如果你想通过shell传输任意字符串(或者实际上是通过任何具有自己语法和特殊字符的中间语言),你需要逃避它:
exec("php path/where/script/is/useArray.php " . escapeshellarg($data) . " &");
请参阅http://php.net/escapeshellarg。
说完这个之后,我会避免这种调用开始并使用其他通信机制,比如使用ØMQ,Gearman等的队列/工作人员设置。但这超出了本主题的范围。
答案 1 :(得分:1)
您通常无法在shell中键入随机字符并将其作为常规文本传递,这就是escapeshellarg()存在的原因(尽管根据我的经验,它只适用于Unix shell和经常在Windows上失败。
在任何情况下,命令行参数仅适用于小参数。如果您需要传输复杂数据,最好使用其他机制:
对于前者,您必须转储exec()
并使用例如proc_open()
- 您可以在manual page中找到用法示例。
对于后者,只需在file system functions中选择您喜欢的。对于小文件,file_put_contents()
/ file_get_contents()
组合可能就好了。