当前位置: 首页 > 知识库问答 >
问题:

Protobuf PHP:无法成功执行protoc gen PHP

顾宣
2023-03-14

我克隆了Protobuf PHP存储库:https://github.com/drslump/Protobuf-PHP.git我在https://github.com/drslump/Protobuf-PHP,我已经花了大约12个小时研究安装和配置问题,试图让protoc gen php将proto文件转换为php类。

我正在运行PHP版本5.3.2,这是我所做的:

  1. 已安装PEAR v1.9.4
  2. 安装Console_CommandLine,并运行PEAR_ENV. reg设置PEAR环境变量
  3. 我尝试了我能想到的每一种排列方式来尝试让这个插件生成一个PHP类文件,但每次尝试都失败了。

我在根文件夹中有一个用于C#项目的proto文件,我在根文件夹中签出了proto-gen php项目(见下文)。

    message AuditLogEntry {
        required int64 ID = 1;
        required int64 Date = 2;
        required string Message = 3;

        optional int32 User_ID = 4;
        optional string User_Username = 5;
        optional int32 ImpUser_ID = 6;
        optional string ImpUser_Username = 7;

        optional string RemoteIP = 8;
    }


    message AuditLogQuery {
        optional int64 DateRangeStart = 1;
        optional int64 DateRangeEnd = 2;
        optional string Search = 3;
        optional int32 UserID = 4;

        optional int32 Limit = 5;
        optional int32 Offset = 6;
    }

    message AuditLogResult {
        repeated AuditLogEntry LogEntries = 1;
        optional int32 TotalResults = 2;
    }

以下是我遇到的几个问题:

>

  • 当我尝试执行最基本的实现时:

    protoc-gen-php.bat AuditLog.proto
    

    我收到以下错误:

    无法打开输入文件:@bin\u dir@\protoc gen php文件名、目录名或卷标语法不正确。

    我在网上找不到有关此错误的任何信息。我正在使用的软件包之一的安装是否存在配置问题?有什么想法吗?

    由于上述错误,我在protoc gen php批处理文件中更改了这一行:

    "%PHPBIN%" -d display_errors=stderr -d log_errors=On -d error_log=Off "@bin_dir@\protoc-gen-php" %*
    

    "%PHPBIN%" -d display_errors=stderr -d log_errors=On -d error_log=Off "protoc-gen-php.php" %*
    

    现在,当我运行问题1中给出的相同命令时,我得到以下输出:

    The filename, directory name, or volume label syntax is incorrect.
    Protobuf-PHP @package_version@ by Ivan -DrSlump- Montes
    
    C:\Development\SkedFlex\php-proto-buffers\AuditLog.proto: File does not reside within any path specified using --proto_path (or -I).  You must specify a --proto_path which encompasses this file.  Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).
    
    ERROR: protoc exited with an error (1) when executed with:
      protoc \
        --plugin=protoc-gen-php="C:\Development\SkedFlex\php-proto-buffers\protoc-gen-php.php.bat" \
        --proto_path="C:\Development\SkedFlex\php-proto-buffers\library\DrSlump\Protobuf\Compiler\protos" \
        --php_out=":./" \
        "C:\Development\SkedFlex\php-proto-buffers\AuditLog.proto"
    

    我按照手册中的规定,使用-I,-o尝试了许多不同的命令:http://drslump.github.com/Protobuf-PHP/protoc-gen-php.1.html,但似乎无法在这方面取得进展。。。

    最后,我尝试直接执行protoc:

    protoc --plugin=protoc-gen-php --php_out=./build AuditLog.proto
    

    这是错误:

    --php_out: protoc-gen-php: The system cannot find the file specified.
    

    我正处在一个被卡住的时刻。有没有人有protoc gen php的经验可以帮助我解决我遇到的问题?

  • 共有1个答案

    孟选
    2023-03-14

    这个bat文件从存储库中签出后不能直接使用,创建Pear包时会对其进行修改。因此,除非您想以某种方式修改库的源代码,否则应该使用Pear安装Protobuf PHP。

    pear channel-discover pear.pollinimini.net
    pear install drslump/Protobuf-beta
    

    如果不想从Pear安装,则必须手动修改protoc gen php。bat文件将最后一行替换为类似的内容:

    C:\path\to\php.exe -d display_errors=stderr -d log_errors=On -d error_log=Off c:\path\to\protobuf-php\protoc-gen-php %*
    

    为了修复“文件不驻留在指定的任何路径中...”错误,您必须确保作为参数给出的任何原型文件都驻留在定义的包含路径中。谷歌的协议编译器不会试图猜测包含路径是什么,所以我们需要在所有情况下手动提供它们。

    protoc-gen-php.bat -i . AuditLog.proto
    

    这应该允许您为原型消息生成PHP文件,尽管该脚本在Windows系统中的测试不如在Linux和OSX系统中的测试。如果您发现任何问题,如果您愿意,您可以直接在项目站点报告它们。

     类似资料:
    • 问题内容: 我在XP上使用python 2.6。我刚刚安装了py2exe,并且可以从hello.py成功创建一个简单的hello.exe。但是,当我尝试在实际程序上使用py2exe时,py2exe会生成一些信息消息,但无法在dist文件夹中生成任何内容。 我的setup.py看起来像这样: 和py2exe输出看起来像这样: py2exe似乎已经找到了我的所有导入文件(尽管看到win32时我感到有些

    • 我试着运行这个简单的测试脚本。我试着从eclipse和cmd启动它。当我启动它时,我会得到提示消息 "无法从'C:\用户\C03049\AppData\本地\Temp\scoped_dir45'6_4977\内部'加载扩展。管理员禁用未打包扩展的加载。" 当我点击ok时,它会加载url,但随后我发现错误 “selenium.common.exceptions.WebDriverException:

    • 我正在尝试从命令行从Android SDK 工具运行 。但是,它不会启动并打印以下异常: 我的命令行是: 已设置。 以下是我的安装(sdkmanager - list): 怎么了?

    • 当我尝试编译我的应用程序时,我得到以下错误: 现在我一直在stackoverflow和其他网站上搜索,我不是唯一一个遇到这个问题的人。我尝试了这个解决方案,也重启了几次程序,并完全重新安装了Android Studio。我仍然得到了同样的错误。我还尝试手动从 文件夹,并手动将最新版本的gradle放入该文件夹。 没有任何帮助。还是会出错。

    • 问题内容: 我有一个JavaScript Ajax调用(jQuery.ajax),它不执行成功回调函数。 我在firebug中看到,该请求已发布,并且按预期返回了有关json的正确结果。怎么了? 问题答案: 很多次,我都遇到过类似的问题,大多数时候,原因是json格式错误。尝试以文本数据类型获取结果,看看这是否是您的问题。 另外,我想问一下您是否使用了“&jsoncallback =?”之类的参数

    • 我试图避免使用阻塞线程模型,而使用反应式模型来实现高吞吐量。我的用例是这样的:有大量的传入消息。对于每条消息,我需要在不阻塞该线程的情况下执行一些I/O操作。在这里,我在一个单独的线程中处理每条消息。如果应用程序被终止,我需要完成正在进行的任务并优雅地关闭。我用的是线。在下面睡眠以模拟密集的I/O操作。代码示例如下: 当我运行这个时,通量似乎忽略了执行者。shutdown()和错误以及中断的异常。