2

我有

$client = new Google_Client();

它是json中的令牌。

现在我想通过 shell_exec() 将此客户端对象以及 json 令牌传递给另一个脚本。
让我们假设命令为

php myscript.php var1 var2 $client $token

现在,由于命令行将所有参数都作为字符串,我无法传递 json 和客户端对象。对于我找到的 jsonserialize()unserialize()可以传递给命令提示符的函数,但是$client如何将对象传递给命令提示符呢?请帮忙。

4

3 回答 3

6

序列化也会“字符串化”对象!您还可以对参数进行 base64 编码/解码,以防止出现特殊字符问题:

$aArgs = array($client, $token);
$sArgs = base64_encode(serialize($aArgs));
exec('php myscript.php '.$sArgs);
于 2013-09-26T09:37:15.677 回答
3

我会使用 json_encode():

存储 PHP 数组的首选方法(json_encode 与序列化)

TLDR?json_encode() 可能存在一些问题:

  • 默认情况下, json_encode() 将 UTF-8 字符转换为 Unicode 转义序列,而 serialize() 不会。注意:要保持 UTF-8 字符不变,您可以使用 PHP 5.4 起的 JSON_UNESCAPED_UNICODE 选项。
  • JSON 将不记得对象的原始类是什么(它们总是作为 stdClass 的实例恢复)。
  • 您不能将 __sleep() 和 __wakeup() 与 JSON 结合使用
  • 只有公共属性使用 JSON 序列化
  • JSON 更便携

但是,如果这些都不是您的用例的问题。它比 serialize() 快 100-150%。(当您解码字符串时,您的 Google_Client() 类将转换为标准类)。

// Script that kicks off the background task
$aArgs = array($client, $token);
$sArgs = base64_encode(json_encode($aArgs));
exec('php myscript.php '.$sArgs . ' > /dev/null 2>/dev/null &');

// myscript.php
$sArgs = json_decode(base64_decode($argv[1]));
// do something with $sArgs here...
于 2015-02-06T03:50:21.013 回答
0

这有点棘手。

首先,如果你想将完全相同的对象传递给另一个脚本,为什么不include呢?或者创建一些函数来代替运行?

其次,你为什么不在那个脚本中创建你的对象呢?它会为你省去很多麻烦。

如果您绝对必须通过 shell_exec 将对象传递给另一个脚本,您可以使用该serialize()函数,但有一些注意事项:

  1. 当然你必须逃避它,例如escapeshellarg
  2. 如果您的对象包含任何资源(例如fopen句柄,直接或间接),它们将不会被序列化,因此您将丢失它们
  3. 您的脚本必须知道您的 Google_Client 类定义,以及它包含引用的任何类的定义。否则它将被反序列化为 __PHP_Incomplete_Class 并且实际上无法使用。

检查手册页序列化

serialize() 处理所有类型,除了资源类型。您甚至可以 serialize() 包含对其自身的引用的数组。您正在序列化的数组/对象内的循环引用也将被存储。任何其他参考都将丢失。序列化对象时,PHP 将尝试在序列化之前调用成员函数 __sleep()。这是为了允许对象在序列化之前进行任何最后一分钟的清理等。同样,当使用 unserialize() 恢复对象时,会调用 __wakeup() 成员函数。

和一个反序列化的

注意: unserialize_callback_func 指令 如果在反序列化期间应实例化未定义的类,则可以设置将调用的回调函数。(以防止获得不完整的对象“__PHP_Incomplete_Class”。)使用您的 php.ini、ini_set() 或 .htaccess 来定义“unserialize_callback_func”。每次应实例化未定义的类时,都会调用它。要禁用此功能,只需清空此设置。

于 2013-09-26T09:54:05.380 回答