-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
开启OPcache,会在请求量大时会报找不到文件 #357
Comments
无论是哪里的锅, 我都都背 -_# 但从表象来看应该是opcache的问题, 你能描述的尽量精确些么, 比如做了什么操作后, 发生错误的时候提示信息是什么, 尽量精确 |
我表示一样,稍微上一点并发,就偶现找不到类。 @laruence PHP7环境,开启了Opcache,apache ab压测,不上并发貌似没事,上了并发就开始蹦错误。 [2048,"Yaf_Loader::autoload(): Could not find class sys_mysql_client in /home/xxxx/yaf/application/library/sys/mysql/client.php","/home/ |
如果关闭了opcache还有么? |
@laruence 稍等我试试,另外一个issue也提到了,它还提到3.0.3没有问题,3.0.4出现了,我刚在看diff代码,初步怀疑一下yaf_loader_is_local_namespace函数。 |
@laruence 关闭opcache就好了~ 补充一下现象:1000个并发请求,会有20个左右去全局目录找class,剩余的是在本地类成功找到。 |
为什么你会怀疑 yaf_loader_is_local_namespace 呢? 是说目录位置寻找错了? |
@laruence 嗯,是被这个现象带过去的,但是看了函数逻辑,木有找到真相。。 我在Bootstrap里注册了2个local namespace:sys和biz,要加载的类叫做:sys_mysql_manager。 看这个函数意图,是先摘出sys_mysql_manager的sys,然后在Yaf_G(local_namespaces)=sys/biz这个字符串里匹配到sys,最后返回1。 没学过php扩展开发,和Opcache有什么关系。。木有思路了。 应该是我看错了,并没有跑到全局目录去找,只是在本地目录里报找不到。 但是异常里的文件路径都是准确的,结合Opcache,我开始怀疑yaf_loader_import函数了-,- |
再补充其他错误类型: [2,"Yaf_Loader::autoload(): Failed opening script /home/liangdong/php7/lib/sys/mysql/manager.php: No such file or directory","/home/liangdong/yaf/application/library/sys/framework/loader.php",19,{"class_name":"sys_mysql_manager"}]Class 'sys_mysql_manager' not found |
/home/liangdong/php7/lib/sys/mysql/manager.php 那个这个文件真实存在么, 另外php有权限读取这个文件么 |
我看错了,鸟哥你说的这个文件不存在,那是我的global路径,但是类应该是本地类。 总结起来有2个情况,本地类莫名其妙跑去全局路径加载,本地类在本地路径提示找不到。 |
@laruence ,我提供点辅助信息: 1,yaf-3.0.3开启opcache没有出现该问题。 同样的问题在issue #320 提到过。 下面是我的PHP环境: PHP 7.1.5 (cli) (built: May 31 2017 12:58:46) ( NTS ) [PHP Modules] [Zend Modules] |
你这样, 你可以尝试开启opcache.memory_protect=1 , 看看有没有coredump出来, 如果有把backtrace贴出来 |
Program terminated with signal 11, Segmentation fault. |
(gdb) f 0 |
(gdb) f 1 |
是不是因为class_name是从zend拿的内存: PHP_METHOD(yaf_loader, autoload) {
在后面*backup改的是class_name的内存,被Protected搞core了:
|
应该已经修复, 请试用https://pecl.php.net/package/yaf 3.0.5 |
got it~ |
PHP 7.1.5
OPcache v7.1.5
yaf 3.0.4
请求量大时,会偶尔报找不到 yaf.library 里边的全局类,也偶尔报找不到 项目里配置的 本地类,关闭OPcache之后就没有这些问题了,不晓得是哪里的锅
The text was updated successfully, but these errors were encountered: