2010-11-20 4 views
4

Я хотел бы написать адаптер для PHP для бинарного API OrientDB.Подключение к OrientDB от PHP

Но мне нужна помощь от кого-то, у кого есть опыт работы с сырыми сокетами в PHP - я не могу даже пройти первое препятствие для подключения PHP к OrientDB.

Я был бы признателен, если кто-то опыт работы с сокетами бы взглянуть на это:

http://code.google.com/p/orient/issues/detail?id=126

Если бы мы могли пройти первое препятствие и фактически послать пакет (упрощенные примеры в нижней части, что страница - прокрутите вниз до конца), я мог бы, конечно, написать адаптер.

И если да, то это, конечно же, будет выпущено как открытый источник.

Надеюсь, кто-то может помочь мне начать работу?

Спасибо!


11/20/2010

Реферирование Net_Socket PEAR, я закончил с по существу тем же кодом я пытался на ранней стадии, используя fsockopen() и обычные PHP-функции потока.

По-прежнему я никуда не ушел. Сервер не реагирует вообще, и даже с 5-секундным тайм-аутом, сценарий просто переходит в глубокий сон и не выходит, пока общий предел PHP-скрипта не превзойден.

Вот код:

<?php 

header('Content-type: text/plain'); 

error_reporting(E_ALL | E_NOTICE | E_WARNING); 

$txid = 123; 
$db = 'demo'; 
$username = 'writer'; 
$password = 'writer'; 

$packet = "\x05". # 1 byte 
    pack('i',$txid). # 4 bytes 
    pack('i',strlen($db)).$db. # string 
    pack('i',strlen($username)).$username. # string 
    pack('i',strlen($password)).$password; # string 

hex_dump($packet); 

$addr = '127.0.0.1'; 
$port = 2424; 
$timeout = 5; 
$errstr = ''; 
$errno = 0; 

$socket = fsockopen($addr, $port, $errno, $errstr, $timeout); 

stream_set_blocking($socket, 1); 

socket_set_timeout($socket, $timeout); 

var_dump($socket); 

fwrite($socket, $packet); 

$response = ''; 
while (!feof($socket)) 
    $response .= fread($socket, 1024); 

hex_dump($response); 

fclose($socket); 

А вот функция hex_dump() Я использую, чтобы проверить пакет я направляющий:

<?php 

function hex_dump($data, $newline="\n") 
{ 
    static $from = ''; 
    static $to = ''; 

    static $width = 16; # number of bytes per line 

    static $pad = '.'; # padding for non-visible characters 

    if ($from==='') 
    { 
    for ($i=0; $i<=0xFF; $i++) 
    { 
     $from .= chr($i); 
     $to .= ($i >= 0x20 && $i <= 0x7E) ? chr($i) : $pad; 
    } 
    } 

    $hex = str_split(bin2hex($data), $width*2); 
    $chars = str_split(strtr($data, $from, $to), $width); 

    $offset = 0; 
    foreach ($hex as $i => $line) 
    { 
    echo sprintf('%6X',$offset).' : '.implode(' ', str_split($line,2)) . ' [' . $chars[$i] . ']' . $newline; 
    $offset += $width; 
    } 
} 

Согласно Луке Garulli, автор OrientDB, пакет, который я отправляю, выглядит правильно. Так что еще что-то не так ...

Это может быть проблема с Windows? Я использую PHP 5.3 в Windows под Apache ...

+0

Интересная идея, но вы должны смотреть на [ PEAR :: Net_Socket] (http://pear.php.net/package/Net_Socket/redirected), если у вас возникли проблемы. Возможно, вы можете моделировать свой класс бинарных протоколов еще за другим классом PEAR Net. – mario

ответ

1

На самом деле, я забыл, что конкретно проблема была, - но я получил ее работу.

Если кто-то хочет видеть рабочую реализацию (будь OrientDB или что-то еще), не стесняйтесь, чтобы взглянуть на общедоступном хранилище здесь:

https://github.com/mindplay-dk/OrientDB-PHP

+2

Ссылка не работает. –

0

Может ли это быть проблемой межсетевого экрана? Добавьте исключение F/W или временно отключите F/W.

Является портом nr. верный? Можете ли вы подключиться к этому порту?

> telnet 127.0.0.1 2424 
+0

Это не проблема брандмауэра - это была проблема с кодом, см. Комментарии выше –

 Смежные вопросы

  • Нет связанных вопросов^_^