在PHP中通过exec发送后无法解码json数组

时间:2016-06-02 08:57:27

标签: php arrays json exec

我有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似乎没有被正确解码。这就是$logDatatestiranje.txt内的看法:

{notificationId:478,userId:92,appId:1512823699024883,message:joj,destinationUrl:https:\/\/www.servis-racunara.net\/pages\/,method:2}

所以这是我在做json_decode之后得到的一些奇怪的类json格式。当然我不知道如何使用这种格式,因为我不能做任何事情:

$notificationId   = $logData['notificationId'];

2 个答案:

答案 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()组合可能就好了。