Google Cloud Vision - 解析期间发生 PHP 错误

Posted

技术标签:

【中文标题】Google Cloud Vision - 解析期间发生 PHP 错误【英文标题】:Google Cloud Vision - PHP Error occurred during parsing 【发布时间】:2020-06-09 00:23:41 【问题描述】:

我正在使用适用于 php 的 Vision API 客户端库。 这是我的代码:

use Google\Cloud\Vision\V1\ImageAnnotatorClient;
putenv("GOOGLE_APPLICATION_CREDENTIALS=/json.json");
$imageAnnotator = new ImageAnnotatorClient();
$fileName = 'textinjpeg.jpg';
$image = file_get_contents($fileName);
$response = $imageAnnotator->labelDetection($image);
$labels = $response->getLabelAnnotations();
if ($labels) 
    echo("Labels:" . PHP_EOL);
    foreach ($labels as $label) 
        echo($label->getDescription() . PHP_EOL);
    
 else 
    echo('No label found' . PHP_EOL);

我收到此错误:

Error occurred during parsing: Fail to push limit. (0)
/srv/www/site.ru/htdocs/vendor/google/protobuf/src/Google/Protobuf/Internal/CodedInputStream.php:345
#0: Google\Protobuf\Internal\CodedInputStream->pushLimit(integer)
    /srv/www/site.ru/htdocs/vendor/google/protobuf/src/Google/Protobuf/Internal/CodedInputStream.php:368
#1: Google\Protobuf\Internal\CodedInputStream->incrementRecursionDepthAndPushLimit(integer, integer, integer)
....
....
....
#15: Google\Cloud\Vision\V1\ImageAnnotatorClient->labelDetection(string)
/srv/www/site.ru/htdocs/local/php_interface/GoogleCloud.php:41

这是异常发生的地方:

public function pushLimit($byte_limit)

    // Current position relative to the beginning of the stream.
    $current_position = $this->current();
    $old_limit = $this->current_limit;

    // security: byte_limit is possibly evil, so check for negative values
    // and overflow.
    if ($byte_limit >= 0 &&
        $byte_limit <= PHP_INT_MAX - $current_position &&
        $byte_limit <= $this->current_limit - $current_position) 
        $this->current_limit = $current_position + $byte_limit;
        $this->recomputeBufferLimits();
     else 
        throw new GPBDecodeException("Fail to push limit.");
    

    return $old_limit;

$byte_limit &lt;= $this-&gt;current_limit - $current_position 是真的

我应该增加 current_position 吗?如果我应该,我该怎么做?在服务器或 PHP 配置中更改某些内容?

【问题讨论】:

【参考方案1】:

这是一件很疯狂的事情!

论坛时不时出现“推送限制失败”的错误。关于问题可能出在哪里,那里给出了各种想法。一种原因可能是源代码通过 Composer 在本地 PC 上编写,然后通过 (S)FTP 传输到服务器。 FTP程序根据文件扩展名决定将数据以ASCII格式还是二进制格式保存在服务器上。

在 vendor/google/protobuf/src/Google/Protobuf/ 中有各种生成的文件,扩展名为 .php 但实际上是二进制文件! (如果您打开文件,您可以立即看到它,例如:vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Any.php) 通过二进制文件显式传输这些文件到服务器的解决方案在我的情况下有效!如有疑问,请将 Google/protobuf 中的完整模块作为二进制文件传输...

【讨论】:

是的,你是对的。这正是我的情况。但是,如果在我的情况下,带有“Protobuf”的谷歌 API 是插件的一部分呢?它被打包在一个 zip 档案中,在不同的主机上,它会给出不同的结果。关于如何解决此行为的任何想法?谢谢。 @alexander.khmelnitskiy 在我的例子中,我通过 Composer 在我的 Windows 开发中安装它,然后通过 (S)FTP(二进制)复制它。如果您将 ZIP 带到服务器并在那里解压缩,则文件应该具有正确的格式 - 如果压缩前它们的格式正确。【参考方案2】:

您提到$byte_limit &lt;= $this-&gt;current_limit - $current_position 为真,因此$byte_limit &gt;= 0$byte_limit &lt;= PHP_INT_MAX - $current_position 为假。

如果$byte_limit &lt;= PHP_INT_MAX - $current_position 为假,那么增加$current_position 不会使其变为真。如果您想调整这些值,使表达式被评估为真,您需要increase the value of PHP_INT_MAX instead。

如果$byte_limit &gt;= 0 为假,则修改$current_limit 不会避免异常。

无论哪种方式,错误似乎是protobuf php库的问题,所以我建议您报告问题there,而不是尝试直接修改值。

【讨论】:

【参考方案3】:

mbstring.func_overload 为 2 这是错误的原因 改成0就可以了

【讨论】:

以上是关于Google Cloud Vision - 解析期间发生 PHP 错误的主要内容,如果未能解决你的问题,请参考以下文章

json Google Cloud Vision API OpenAPI

Google Cloud Vision Document OCR - 在结果文本中保留布局

IndexError:带有 Google Cloud Vision API 的字节数组

Google Cloud Vision API PDF 文本提取

如何通过HTTP请求验证Google Cloud Vision

如何提高google cloud vision api的处理速度?