<?php

require dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "contrib/php/addressbook.proto.php";
// example: ProtocolBuffers to Json format
$person = new Tutorial_Person();
$person->setId(21);
$person->setName("John Doe");
$descriptor = $person->getDescriptor();
$result = array();
foreach ($descriptor->getFields() as $field) {
    if (!$field->isExtension()) {
        if ($person->has($field->getName())) {
            // this does not care about Message.
            $value = $person->get($field->getName());
            $result[$field->getName()] = $value;
        }
    }
}
echo json_encode($result, JSON_PRETTY_PRINT);
<?php

require dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "contrib/php/addressbook.proto.php";
$person = new Tutorial_Person();
$person->setId(21);
$person->setName("John Doe");
$data = serialize($person);
printf("# decoding benchmark (serialize / unserialize).\n");
printf("# target message size: %d bytes.\n", strlen($data));
printf("# start\n");
$begin = microtime(true);
$attempts = 100000;
for ($i = 0; $i < $attempts; $i++) {
    unserialize($data);
}
$end = microtime(true);
printf("# Result:\n");
printf("# decoding %d messages\n", $attempts);
printf("# processing time: %6f (%f/message)\n", $end - $begin, ($end - $begin) / $attempts);
printf("# total bytes: %d bytes\n", strlen($data) * $attempts);
<?php

require dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "contrib/php/addressbook.proto.php";
$person = new Tutorial_Person();
$person->setId(21);
$person->setName("John Doe");
$data = msgpack_pack($person);
printf("# decoding benchmark (msgpack).\n");
printf("# target message size: %d bytes.\n", strlen($data));
printf("# start\n");
$begin = microtime(true);
$attempts = 100000;
for ($i = 0; $i < $attempts; $i++) {
    msgpack_unpack($data);
}
$end = microtime(true);
printf("# Result:\n");
printf("# decoding %d messages\n", $attempts);
printf("# processing time: %6f (%f/message)\n", $end - $begin, ($end - $begin) / $attempts);
printf("# total bytes: %d bytes\n", strlen($data) * $attempts);
<?php

require dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "contrib/php/addressbook.proto.php";
$person = new Tutorial_Person();
$person->setId(21);
$person->setName("John Doe");
$data = $person->serializeToString($person);
printf("# decoding benchmark (protocolbuffers).\n");
printf("# target message size: %d bytes.\n", strlen($data));
printf("# start\n");
$begin = microtime(true);
$attempts = 100000;
for ($i = 0; $i < $attempts; $i++) {
    Tutorial_Person::parseFromString($data);
}
$end = microtime(true);
printf("# Result:\n");
printf("# decoding %d messages\n", $attempts);
printf("# processing time: %6f (%f/message)\n", $end - $begin, ($end - $begin) / $attempts);
printf("# total bytes: %d bytes\n", strlen($data) * $attempts);
<?php

require dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "contrib/php/addressbook.proto.php";
$person = new Tutorial_Person();
$person->setId(21);
$person->setName("John Doe");
$data = ProtocolBuffers::encode($person);
printf("# decoding benchmark (protocolbuffers).\n");
printf("# target message size: %d bytes.\n", strlen($data));
printf("# start\n");
$begin = microtime(true);
$attempts = 100000;
for ($i = 0; $i < $attempts; $i++) {
    ProtocolBuffers::decode("Tutorial_Person", $data);
}
$end = microtime(true);
printf("# Result:\n");
printf("# decoding %d messages\n", $attempts);
printf("# processing time: %6f (%f/message)\n", $end - $begin, ($end - $begin) / $attempts);
printf("# total bytes: %d bytes\n", strlen($data) * $attempts);
<?php

require dirname(__FILE__) . DIRECTORY_SEPARATOR . join(DIRECTORY_SEPARATOR, array("php", "addressbook.proto.php"));
$db = "addressbook.db";
$addressbook = load($db);
$person = new Tutorial_Person();
$person->setId(1);
$person->setName("John Doe");
$person->setEmail("*****@*****.**");
$phone = new Tutorial_Person_PhoneNumber();
$phone->setNumber("1234 5 67 78");
$phone->setType(Tutorial_Person_PhoneType::HOME);
$person->appendPhone($phone);
$phone = new Tutorial_Person_PhoneNumber();
$phone->setNumber("1234 5 67 79");
$phone->setType(Tutorial_Person_PhoneType::HOME);
$person->appendPhone($phone);
echo $person;
exit;
echo "____________________\n";
$addressbook->appendPerson($person);
var_dump($addressbook);
save($db, $addressbook);
exit;
function load($path)
{
    $data = @file_get_contents($path);
    try {
        $result = ProtocolBuffers::decode("Tutorial_AddressBook", $data);
    } catch (ProtocolBuffersInvalidProtocolBufferException $e) {
        $result = new Tutorial_AddressBook();
 /**
  * get descriptor for protocol buffers
  * 
  * @return array
  */
 public static function getDescriptor()
 {
     if (!isset(self::$descriptor)) {
         $desc = new ProtocolBuffersDescriptorBuilder();
         $desc->addField(1, new ProtocolBuffersFieldDescriptor(array("type" => ProtocolBuffers::TYPE_STRING, "name" => "name", "packable" => false, "repeated" => false, "default" => null)));
         $desc->addField(2, new ProtocolBuffersFieldDescriptor(array("type" => ProtocolBuffers::TYPE_INT32, "name" => "id", "packable" => false, "repeated" => false, "default" => null)));
         $desc->addField(3, new ProtocolBuffersFieldDescriptor(array("type" => ProtocolBuffers::TYPE_STRING, "name" => "email", "packable" => false, "repeated" => false, "default" => null)));
         $desc->addField(4, new ProtocolBuffersFieldDescriptor(array("type" => ProtocolBuffers::TYPE_MESSAGE, "name" => "phone", "packable" => false, "repeated" => false, "default" => null, "message" => "Tutorial_Person_PhoneNumber")));
         self::$descriptor = $desc->build();
     }
     return self::$descriptor;
 }