wechatpay-apiv3 / wechatpay-php

微信支付 APIv3 的官方 PHP Library,同时也支持 APIv2
Apache License 2.0
475 stars 98 forks source link

php 使用 swoole报错。 #88

Closed zhlhuang closed 2 years ago

zhlhuang commented 2 years ago

curl-native 已经确认开启了。

swoole

Swoole => enabled Author => Swoole Team team@swoole.com Version => 4.8.9 Built => Apr 19 2022 22:22:56 coroutine => enabled with boost asm context epoll => enabled eventfd => enabled signalfd => enabled cpu_affinity => enabled spinlock => enabled rwlock => enabled sockets => enabled openssl => OpenSSL 1.0.2u 20 Dec 2019 curl-native => enabled pcre => enabled zlib => 1.2.7 mutex_timedlock => enabled pthread_barrier => enabled futex => enabled async_redis => enabled

Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => On => On swoole.unixsock_buffer_size => 8388608 => 8388608

调用上传媒体素材报 WARNING ProcessPool::wait(): worker#3 abnormal exit, status=0, signal=11 ....

GCC_VERSION: 4.8.5 20150623 (Red Hat 4.8.5-44) OPENSSL_VERSION: OpenSSL 1.0.2u 20 Dec 2019 PHP_VERSION : 7.4.28

TheNorthMemory commented 2 years ago

把你的上传代码贴一下

zhlhuang commented 2 years ago

把你的上传代码贴一下 我今天尝试一下,将图片处理变小之后就可以成功。不知道是不是curl 处理有些限制的原因。也没有设置超时。

$media = new MediaUtil($image_path);
$resp = $this->weChatPayService->instance->chain('v3/merchant/media/upload')
->post([
'body' => $media->getStream(),
'headers' => [
'content-type' => $media->getContentType(),
]
]);
TheNorthMemory commented 2 years ago

Guzzle 默认会在上传文件(文件大约1M)时,给添加 Expect: 100-continue 请求头,详细见这里,可以尝试在 post([])方法内,关闭或者按官方文档约定的最大允许文件字节值试试看,代码例如:

->chain('v3/merchant/media/upload')
->post([
    'body' => $media->getStream(),
    'headers' => [
        'Content-Type' => $media->getContentType(),
    ],
    'expect' => false,
 );

或者

->chain('v3/merchant/media/upload')
->post([
    'body' => $media->getStream(),
    'headers' => [
        'Content-Type' => $media->getContentType(),
    ],
    'expect' => 2*1024*1024+1,
 );
zhlhuang commented 2 years ago

@TheNorthMemory 还是不行,我测试图片大小,大概是大于64K调用接口就会报错。不知道是不是我系统或者是swoole有些配置出错了。

TheNorthMemory commented 2 years ago

建议看下 https://github.com/hyperf/hyperf/pull/2055 ,直觉上你应该是用的hyperf的吧?

zhlhuang commented 2 years ago

建议看下 hyperf/hyperf#2055 ,直觉上你应该是用的hyperf的吧?

我测出来确实超过64K就会出现错误,我看看是不是nginx配置上有问题。

TheNorthMemory commented 2 years ago

你把你代码里的 content-type 改成 Content-Type , 以及增加 'expect' => false 试一试

zhlhuang commented 2 years ago

你把你代码里的 content-type 改成 Content-Type , 以及增加 'expect' => false 试一试

试过了,还是不行。感觉是系统或者是swoole配置的问题。

xy-peng commented 2 years ago

请求发送出来了吗?还是本地出错了?

zhlhuang commented 2 years ago

请求发送出来了吗?还是本地出错了?

我认为请求是没发出去的,异常也没抛。排查一天了,64K不知道是那个配置。同样的环境我换成了fpm没有问题。感觉是我swoole或者是操作系统的问题。

TheNorthMemory commented 2 years ago

建议看下 hyperf/hyperf#2055 ,直觉上你应该是用的hyperf的吧?

我测出来确实超过64K就会出现错误,我看看是不是nginx配置上有问题。

php stream读取文件时一个块大小刚好就是64KB,直觉是你的环境curl版本与swoole的native-curl不配套所致,类似延展阅读可以看这里 https://github.com/swow/swow/issues/65#issuecomment-841186096

另外,你的环境openssl版本是1.0.2u,这个也是个潜在的问题点,curl在处理tls请求时,也用到了openssl,也可能不配套。

建议用docker拉齐 php7.4.28 openssl 1.1.1n curl7.82.0 再试试看。

zhlhuang commented 2 years ago

升级了openssl还是不行。 curl 版本是 7.29.0 。不知道怎么排查是不是与swoole 的 native-curl 配套

TheNorthMemory commented 2 years ago

建议给个完整样本代码(敏感信息可略去)。

zhlhuang commented 2 years ago

建议给个完整样本代码(敏感信息可略去)。

@TheNorthMemory 我曲线救国进行排查,我用easyWechat 4.5.0使用小程序上传素材的接口是正常的。但是这个sdk的就有问题,我现在可以肯定应该是是这个sdk的问题。 我使用的 guzzlehttp/guzzle 是 7.4.1

xy-peng commented 2 years ago

如果有新的反馈,可以随时再打开