You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Jake Farrell (JIRA)" <ji...@apache.org> on 2013/04/20 04:07:15 UTC
[jira] [Closed] (THRIFT-1903) PHP namespaces cause binary protocols
to not be used
[ https://issues.apache.org/jira/browse/THRIFT-1903?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jake Farrell closed THRIFT-1903.
--------------------------------
Resolution: Fixed
Fix Version/s: 1.0
Assignee: Tyler Hobbs
Thanks Tyler, committed
> PHP namespaces cause binary protocols to not be used
> ----------------------------------------------------
>
> Key: THRIFT-1903
> URL: https://issues.apache.org/jira/browse/THRIFT-1903
> Project: Thrift
> Issue Type: Bug
> Components: PHP - Compiler, PHP - Library
> Affects Versions: 0.9
> Environment: Centos 6.4
> Reporter: Tim Behrendsen
> Assignee: Tyler Hobbs
> Fix For: 1.0
>
> Attachments: THRIFT-1903-v1.txt
>
>
> Currently the compiled code produces the following check for binary capability (slightly different in other places, but same idea):
> {noformat}
> $bin_accel = ($this->output_ instanceof TProtocol::$TBINARYPROTOCOLACCELERATED) && function_exists('thrift_protocol_write_binary');
> {noformat}
> The TProtocol::$TBINARYPROTOCOLACCELERATED variable contains 'TBinaryProtocolAccelerated'. This check always fails because when the protocol class is instantiated like:
> {noformat}
> use Thrift\Protocol\TBinaryProtocolAccelerated;
> $protocol = new TBinaryProtocolAccelerated($transport);
> {noformat}
> (as shown in the current PHP example), the protocol class is instantiated as 'Thrift\Protocol\TBinaryProtocolAccelerated'. In the standard compiled class, TBinaryProtocolAccelerated's namespace is not use'd, so the instanceof fails.
> EXAMPLE PROGRAM
> Based on PHP tutorial, only needs compiled code. Does not make a
> connection and demonstrates the instanceof failure.
> --------------------------------------------------------------------
> {noformat}
> namespace tutorial\php;
> define('THRIFT_ROOT', '/home/tim/projects/inquisic/thrift-0.9.0/lib/php/lib');
> require_once(THRIFT_ROOT . '/Thrift/ClassLoader/ThriftClassLoader.php');
> use Thrift\ClassLoader\ThriftClassLoader;
> $GEN_DIR = '/home/tim/public_html/thrift0.9/gen-php';
> $loader = new ThriftClassLoader();
> $loader->registerNamespace('Thrift', THRIFT_ROOT);
> $loader->registerDefinition('shared', $GEN_DIR);
> $loader->registerDefinition('tutorial', $GEN_DIR);
> $loader->register();
> use Thrift\Protocol\TBinaryProtocol;
> use Thrift\Protocol\TBinaryProtocolAccelerated;
> use Thrift\Transport\THttpClient;
> use Thrift\Transport\TBufferedTransport;
> $socket = new THttpClient('localhost', 8383, '/~tim/thrift0.9/PhpServer.php');
> $transport = new TBufferedTransport($socket, 1024, 1024);
> $protocol = new TBinaryProtocolAccelerated($transport);
> // Reset namespace
> namespace tutorial\php;
> use Thrift\Protocol\TProtocol;
> use Thrift\Protocol\TBinaryProtocol;
> print "protocol class = " . get_class($protocol) . "\n";
> print "check class = " . TProtocol::$TBINARYPROTOCOLACCELERATED . "\n";
> if ($protocol instanceof TProtocol::$TBINARYPROTOCOLACCELERATED)
> print "Standard: INSTANCE!\n";
> else
> print "Standard: NOT INSTANCE!\n";
> $good_class = '\Thrift\Protocol\TBinaryProtocolAccelerated';
> if ($protocol instanceof $good_class)
> print "Good: INSTANCE!\n";
> else
> print "Good: NOT INSTANCE!\n";
> {noformat}
> ---------------------------------------------------------------------
> PROGRAM OUTPUT:
> ---------------------------------------------------------------------
> {noformat}
> protocol class = Thrift\Protocol\TBinaryProtocolAccelerated
> check class = TBinaryProtocolAccelerated
> Standard: NOT INSTANCE!
> Good: INSTANCE!
> {noformat}
> ---------------------------------------------------------------------
> WORKAROUND:
> Note that leading backslash is required. Just having 'Thrift\Protocol\...' etc will not work.
> ---------------------------------------------------------------------
> {noformat}
> Changed line 37 in TProtocol.php to:
> static $TBINARYPROTOCOLACCELERATED = '\Thrift\Protocol\TBinaryProtocolAccelerated';
> {noformat}
> ---------------------------------------------------------------------
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira