• [技术干货] PHP 引用的概念
    什么是引用?在 PHP 中引用意味着用不同的名字访问同一个变量内容。它不是C的指针,保存的并不是内存地址,无法进行指针运算。引用只是符号表的别名。就像 Unix 系统中的硬链接, Windows 系统中的快捷方式。上面是官方手册中的原文,怎么说呢,引用其实和我们印象中的C里面的指针并不是相同的概念。指针是针对真实内存的操作,引用是针对指向这个内存的符号表的操作。还是从操作系统的快捷方式来说,快捷方式是可以删的,这就是PHP的引用。而C不仅删了快捷方式,还把原文件也给删了,这就是C的指针操作。// 引用不是指针 $a = 1; $b = &$a; echo $a, '===', $b, PHP_EOL; unset($b); echo $a, '===', $b, PHP_EOL;上面的代码是在PHP中,我们把b变量指向b变量指向a,作为a的引用变量。然后删除a的引用变量。然后删除b,对$a没有任何影响。#include <stdio.h> #include <stdlib.h> int main() { // C 中的指针和引用 int a = 1; int* b = &a; printf("%i\n", a); // 1 free(b); // free b printf("%i\n", a); //get error: *** error for object 0x7fff6350da08: pointer being freed was not allocated return 0; }而C中的引用指针就不行了,我们把b变量删掉后,再打印a变量就直接报错了。虽然说PHP的底层也是C写得,但我们都知道C中的指针是出了名的变态,没有一定的功底非常容易出错。所以PHP的开发者没有暴露C的原始指针能力,而是采用了和Java之类的类似的引用能力。这也是现代语言的特性,不需要我们过多的关注过于底层的能力,而将更多的时间放在业务实现上。引用在数组和对象中的使用如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。$arr1 = ["a", "b"]; $t1 = &$arr1[1]; $arr2 = $arr1; $arr2[1] = "c"; var_dump($arr1); // array(2) { // [0]=> // string(1) "a" // [1]=> // &string(1) "c" // } $arr1 = ["a", "b"]; $t1 = &$arr1[1]; unset($t1); // unset 掉引用 $arr2 = $arr1; $arr2[1] = "c"; var_dump($arr1); // array(2) { // [0]=> // string(1) "a" // [1]=> // string(1) "b" // }这个其实挺有意思的,我们对比这两个例子可以看出一个问题,t变量指向t变量指向arr[1]的引用。arr2直接=这个arr2直接=这个arr1,没有使用引用,然后arr2修改了arr2修改了arr2[1]的内容,arr1相应的内容也发生了改变,如果unset掉arr1相应的内容也发生了改变,如果unset掉t变量,则$arr1相应的内容就不会发生改变。对此,我在文档中找到了下面的解释:由于PHP内部工作的特殊性,如果对数组的单个元素进行引用,然后复制数组,无论是通过赋值还是通过函数调用中的值传递,都会将引用复制为数组的一部分。这意味着对任一数组中任何此类元素的更改都将在另一个数组(和其他引用中)中重复,即使数组具有不同的作用域(例如,一个是函数内部的参数,另一个是全局的)!在复制时没有引用的元素,以及在复制数组后分配给其他元素的引用,将正常工作(即独立于其他数组)。不仅仅是数组,对象的引用也会有一些好玩的问题。$o1 = new stdClass(); $o1->a = 'a'; var_dump($o1); // object(stdClass)#1 (1) { // ["a"]=> // string(1) "a" // } $o2 = &$o1; $o3 = $o1; $o2->a = 'aa'; var_dump($o1); // object(stdClass)#1 (1) { // ["a"]=> // string(2) "aa" // } var_dump($o3); // $o2修改了$a为'aa',$o3也变成了'aa' // object(stdClass)#1 (1) { // ["a"]=> // string(2) "aa" // } $o1->a = 'aaa'; $o1 = null; var_dump($o2); // $o2引用变成了null // NULL var_dump($o3); // $o3不仅引用还存在,并且$a变成了'aaa' // object(stdClass)#1 (1) { // ["a"]=> // string(3) "aaa" // }上面例子中有三个对象,o1、o1、o2、o3,其中,o3,其中,o2是对o1的引用,o1的引用,o3是直接赋值为o1。对o1。对o2属性的操作不仅会反映在o1中,也会反映到o1中,也会反映到o3中。其实我们之前专门有一篇文章就讲的这个问题,首先对象默认赋值就是引用,其次这个例子很好地证明了引用就是一个符号表的绑定。删除了快捷方式对原始对象和其他快捷方式没有任何影响。引用的传递关于引用在方法参数上的传递,最重要的是记住两点:一是方法内部修改了变量外部也会变,这是引用的特性嘛;二是只能传递变量、New 语句、从函数中返回的引用三种类型。error_reporting(E_ALL); function foo(&$var) { $var++; echo 'foo:', $var; } function bar() // Note the missing & { $a = 5; return $a; } foo(bar()); // 自 PHP 5.0.5 起导致致命错误,自 PHP 5.1.1 起导致严格模式错误 // 自 PHP 7.0 起导致 notice 信息,Notice: Only variables should be passed by reference foo($a = 5); // 表达式,不是变量, Notice: Only variables should be passed by reference // foo(5); // 导致致命错误 !5是个常量! /////////////////////////////// // 正确的传递类型 $a = 5; foo($a); // 变量 function &baz() { $a = 5; return $a; } foo(baz()); // 从函数中返回的引用 function foo1(&$var) { print_r($var); } foo1(new stdClass()); // new 表达式引用的返回引用的返回并不是经常使用的一个能力。文档中的原文是:不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!$a = 1; function &test(){ global $a; return $a; } $b = &test($a); $b = 2; echo $a, PHP_EOL;当你想要返回一个引用变量的时候,一定要给方法定义和方法调用的时候都使用&符号。这个是需要注意的点。当其他地方修改原本的变量值或者返回的变量值经过修改后,都会影响到所有调用这个值的地方。所以说,引用的返回是比较危险的,因为你不清楚什么时候在什么地方这个值可能发生了修改,对于bug的排查会非常困难。引用的取消取消引用其实就是直接unset掉变量就可以了。但是一定要记住,PHP中的引用是指向的符号表,对原始真实的值是不起作用的,所以即使unset掉了最原始的那个变量,对其它引用赋值的变量也不会有影响!!$a = 1; $b = &$a; $c = &$b; $b = 2; echo '定义引用后:', $a, '===', $b, '===', $c, PHP_EOL; unset($b); $b = 3; echo '取消$b的引用,不影响$a、$c:', $a, '===', $b, '===', $c, PHP_EOL; $b = &$a; unset($a); echo '取消$a,不影响$b、$c:', $a, '===', $b, '===', $c, PHP_EOL; // 定义引用后:2===2===2 // 取消$b的引用:2===3===2 // 取消$a,不影响$c:===3===2 $a = 1; $b = & $a; $c = & $b; // $a, $b, $c reference the same content '1' $a = NULL; // All variables $a, $b or $c are unset echo '所有引用成空:', $a, '===', $b, '===', $c, PHP_EOL;
  • [问题求助] 【IotDA产品】【应用侧PHP命令下发功能】遇到 IOTDA.014106
    PHP用curl写的post设备命令下发接口,json格式,参数:{"service_id":"DevicePara","command_name":"DevCommand","paras":{"switch":"ON"}},但是返回总是提示{"error_code":"IOTDA.014106","error_msg":"CommandBody for mqtt protocol is not correct."}。同样的将参数复制到Postman又能成功。有没有高手指点一下是什么地方出了问题?
  • [热门活动] 【活动已结束,获奖名单已公布】【鲲鹏学习季】限时5折优惠 · 购买微认证,考证书还可赢京东卡等好礼!
     什么是微认证?一站式在线学习、实验与考试,零基础也可学习前沿技术,快速获得场景化的技能提升,考取权威认证证书。点此进入“微认证”专区微认证限时5折优惠微认证购买链接5折优惠:通过鲲鹏ECS搭建免费个人书库点击购买并考证5折优惠:基于鲲鹏搭建zabbix分布式监控系统点击购买并考证5折优惠:基于鲲鹏架构的Redis搭建高性能网盘点击购买并考证5折优惠:基于BoostKit的虚拟化部署和调优实践点击购买并考证5折优惠:基于BoostKit的MySQL性能优化点击购买并考证5折优惠:鲲鹏云服务搭建BCManager存储灾备系统点击购买并考证5折优惠:华为云鲲鹏弹性云服务器高可用性架构实践点击购买并考证5折优惠:鲲鹏加速库原理及应用体验点击购买并考证 考微认证,赢码豆、京东卡 1)活动期间内,任选“微认证”专区的微认证,购买后考取证书并按要求回帖,即可获得1000码豆;成功考取多张证书,可累计获得相应码豆;(鲲鹏相关的微认证共17个,都可参与本次活动)回帖格式:华为云账号+证书名称+证书编号+证书截图,截图中必须显示证书有效期至、姓名、证书编号;(回帖已设为仅版主可见)2)凡成功考证的用户,还可额外抽奖京东卡。抽奖京东卡的张数=成功考取证书的总张数x30%(每张证书被抽中的概率为30%,同一位用户可以抽取多张京东卡);3)考取的微认证必须为首次考取才可有效,否则不予发奖。 领代金券,0元购买微认证 (代金券已抢完,请知~)1)报名期:7月1日-7月15日,需要领取代金券的用户,请扫码进群报名。2)领券期:7月8日-7月15日,可领取代金券,限量400张,先抢先得。3)代金券的有效使用期:7月8日-7月15日。(领取代金券后请尽快购买微认证,购买后请在活动时间内考取证书)微认证代金券金额/元代金券数量代金券领取链接购买链接鲲鹏软件迁移实践28100已领完点击购买并考证鲲鹏软件性能调优实践28100已领完点击购买并考证鲲鹏BoostKit分布式存储概述和调优实践28100已领完点击购买并考证基于鲲鹏HPC解决方案的应用实践38100已领完点击购买并考证代金券使用规则1)有效期:代金券存在有效期。若代金券还未到生效日期,请耐心等待代金券生效后再使用。若代金券已过期,则无法再使用;2)数量限制:1次支付只能用1张代金券,不支持多次使用;3)转增规则:不可转赠。【点击查看操作指引】华为云微认证购买流程指引(使用代金券) 活动奖品  什么是码豆?会员中心入口:https://devcloud.huaweicloud.com/bonususer/home 码豆奖励活动规则:1)码豆可在码豆会员中心兑换实物礼品;2)码豆只能用于会员中心的礼品兑换,不得转让,具体规则请到会员中心阅读“码豆规则”;3)为保证码豆成功发放,如果修改过账号名还请向工作人员提供修改前后的账号名。  活动时间 7月1日—7月31日 活动规则 1)只有考取以上“微认证”专区的微认证证书,才可参与本次活动;2)请务必使用个人账号参与活动(IAM、企业账号等账号参与无效);3)所有获得华为奖项的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励;4)本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励;一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励;5)为保证您顺利领取活动奖品,请您提前填写奖品收货信息,如您没有填写,视为放弃奖励【点击此处填写信息】。活动获奖信息填写时间截止2021年8月5日,如未填写视为弃奖,请知;6)本次活动,码豆预计于2021年8月9日前完成发放,实物奖品预计于2021年8月13日前完成发放,发放时间根据实际情况动态调整,如有延期敬请见谅;7)本次活动幸运奖将采用巨公摇号平台(https://www.jugong.wang/random-portal/)进行抽取,如您对评奖方式有异议,请勿参加本次活动;8)其他事宜请参考【鲲鹏论坛活动规则】,本活动最终解释权归华为云所有。以下是获奖用户名单公示昵称所得码豆所得京东卡张数考过IE励志当攻城狮90003Jack2040003richblue8850002历雨汐20002hw99966620002Easy Redmine30001付豪之家30001hw6205645320001philips8820001(和其他获奖账号同一个实名认证,不予发奖)shao111220001yaoyao1520001千江有水千江月30001我不是我20001阿弥陀佛10001huawei-iot4000登山不要怕4000lyh20182000pr0d1gy2000Solo丶鲲鹏2000ying12122000yvan10102000陪姐2000王亦臻2000meet001000钢铁不钢铁侠1000tanboss32322000
  • [问题求助] PHP 怎么判断对象是否存在
    在OBS怎么使用PHP判断对象是否存在?
  • [技术讨论] 【求助大神】鲲鹏云服务器make php7.4出现错误
    对php包进行make时,报invalid 'asm': invalid operand prefix '%c',网上查了资料好像与arm架构有关,不太懂这方面的知识,未找到解决方案,求助下论坛
  • [问题求助] PHP通过ODBC驱动连接openGauss
    已经完成openEluer、openGuass、ODBC、PHP的安装与配置。直接通过命令行的方式执行PHP脚本可以获取数据。通过浏览器访问时出现错误,内容如下:Fatal error: Uncaught PDOException: SQLSTATE[01000] SQLDriverConnect: 0 [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/psqlodbcw.so' : file not found in /var/www/html/index1.php:3 Stack trace: #0 /var/www/html/index1.php(3): PDO->__construct('odbc:Driver={Ga...', 'monitor', 'pwd@1212') #1 {main} thrown in /var/www/html/index1.php on line 3请帮忙看看吧,谢谢!!!
  • [openEuler] 在openEuler上安装PHP的imagick,redis扩展
    1、安装PHP在openEuler上是可以用yum install 安装PHP 以及php-fpm的,这里还需要安装php-devel,后面会用到yum install php php-fpm php-devel安装完成之后,我们查看当前php自带的扩展包php -m2、安装imagick扩展下载源码wget http://pecl.php.net/get/imagick-3.4.3.tgz解压安装tar -xzvf imagick-3.4.3.tgz cd imagick-3.4.3 phpize ./configure make && make install安装完成后,会打印出安装的路径,到路径下看一下,是否以及存在so文件更改php.ini加入so文件vi /etc/php.ini在末尾加入extension = imagick.so重启php,查看扩展包service php-fpm restart可以看到扩展包已经成功安装3、安装redis扩展安装redis扩展需要先安装json扩展,直接yum 安装即可 yum install php-json下载源码wget https://pecl.php.net/get/redis-5.0.0.tgz解压安装,与上面类似tar -xzvf redis-5.0.0.tgz cd redis-5.0.0 phpize ./configure make && make install安装完成后查看so文件是否存在更改php.ini加入so文件vi /etc/php.ini在末尾加入,这里要注意,一定要把json放在redis前面,否则会报错extension = json extension = redis.so重启php,查看扩展包service php-fpm restartok了!
  • [问题求助] 【PHP7.2.10启动报错】【PHP安装MySQL模块】
    PHP Warning:  PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/mysqli (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/mysqli: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20170718/mysqli.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0php启动测试报错, /usr/local/lib/php/extensions/no-debug-non-zts-20170718/mysqli.so文件存在,问题尝试无法解决,请大神帮忙!感谢。操作系统:uosEuler release 20 (release)芯片:kunpeng920
  • [热门活动] 【活动结束,获奖名单已公布】【鲲鹏直播间】毕昇编译器,邀请好友看直播赢HUAWEI MateBoo
    本场直播介绍面向鲲鹏平台的高性能编译器--毕昇编译器。毕昇编译器基于开源LLVM实现,针对高性能计算(HPC)场景,结合鲲鹏处理器的硬件特征,进行了自动向量化、内存布局、循环优化、全局优化等的适配和增强。通过编译优化和与鲲鹏的软硬件协同,毕昇编译器相对开源LLVM实现了HPC应用的性能大幅提升。我们的鲲鹏布道师景端阳将会从毕昇编译器的基本架构设计到主要优化特性,结合HPC应用场景的典型案例,介绍毕昇编译器的编译优化如何提升鲲鹏平台的应用性能。【直播时间&报名地址】2021年5月31日 15:00-16:00>>>戳我观看直播回放<<<成功报名后,可通过开发者个人中心-我的直播进入直播间【专家介绍&直播简介】 【参与方式&奖项设置】一、参与直播互动登录直播平台并签到,您将获得2轮抽奖机会:第一轮:抽取5名幸运观众送出收纳包一个第二轮:抽取5名幸运观众送出PVC手提包一个直播过程中进行提问,专家老师会选取多个问题进行线上解答,前三名被抽中回答问题的用户将获得华为智能体脂秤一个。(同一用户不可重复获奖)二、邀请新用户看直播赢三重福利5月24日-5月31日期间,邀请新用户享三重好礼!点击报名链接,报名后会生成个人的专属海报,分享专属海报给好友,使好友报名并回帖签到,即为分享成功。报名链接:>>>点我报名并分享好友<<< 1)报名成功后,点击“分享有礼”,生成个人专属二维码,保存并分享海报或链接; 通过你的二维码/链接来报名的新用户都是你分享量; 2)好友通过专属二维码或链接进入报名页,成功报名后回到本帖,填写下方问卷并回帖“已报名并填写问卷”即为完成邀请;福利一:邀请好友就送码豆每分享给一位好友即可获得500码豆(好友必须为5月24日起新注册的用户),当邀请人数≥50时,达到可获得码豆上限25000,500万码豆发完即止;福利二:参与邀请排行榜赢大奖分享量前10名的用户还有额外大奖↓↓↓分享量TOP 1的用户:奖励价值4099元的HUAWEI MateBook D 14 锐龙版 (分享人数不少于1666人)分享量TOP 2的用户:奖励价值1099元的HUAWEI FreeBuds Pro 真无线耳机(分享人数不少于666人)分享量TOP 3- 10的用户:奖励价值329元的华为超级快充立式无线充电器福利三:新用户完成问卷参与幸运抽奖问卷链接:>>>点我填写问卷<<<新用户完成上述问卷后还可以参与抽奖,我们将抽出20名幸运用户各送出文化衫一件。注意:通过分享报名的新用户必须完成以下操作才算分享成功:1)5月24日起新注册的用户,通过专属海报来到报名页,成功完成报名。2)报名成功后,填写问卷,成功提交问卷。3)提交问卷成功后,回到本帖,并回帖以下内容:已报名并填写问卷。 活动规则1)请务必使用个人账号参与活动(IAM、企业账号等账号参与无效);2)被邀请的新用户必须完成报名+填写问卷+回帖任务才算邀请成功;如发现存在邀请账号为机器注册账号或无效账号将取消此部分邀请数据;一旦发现为获取奖励资格而异常注册账号等破坏活动公平性的行为,我们将取消相关人员获奖资格;3)获奖用户需在华为云进行实名认证,请于获奖后3个工作日内完成实名认证,否则视为放弃奖励;同一身份信息只能获奖一次;多个账号参与活动的,只能获一次奖励;4)本次活动问卷抽奖将采用巨公摇号平台(https://www.jugong.wang/random-portal/)进行抽取,如您对评奖方式有异议,请勿参加本次活动;5)为保证您尽快领取活动奖品,请您提前填写奖品收货信息,请您在7月15日前填写,逾期反馈视为放弃奖励。收货信息请【点击此处填写】;本次活动所有奖品预计于2021年7月30日前完成发放,发放时间根据实际情况动态调整,如有延期敬请见谅;6)其他事宜请参考【鲲鹏论坛活动规则】,本活动最终解释权归华为云所有。什么是码豆?会员中心入口:https://devcloud.huaweicloud.com/bonususer/home码豆奖励活动规则:1)码豆可在码豆会员中心兑换实物礼品;2)码豆只能用于会员中心的礼品兑换,不得转让,具体规则请到会员中心阅读“码豆规则”;3)为保证码豆成功发放,如果修改过账号名还请向工作人员提供修改前后的账号名。本期邀请活动获奖名单公布lusheng3233获得华为超级快充立式无线充电器1个(第一、第二名邀请人数均未达最低邀请人数要求,奖品不予发放。)请获奖的同学在6月15日前联系版主,反馈您的收件信息(收件人姓名、电话、收件地址),逾期将视为弃奖。另外,本次活动期间部分用户通过非常规手段违规参与活动,邀请的用户账号经云社区后台IT人员核查均为无效账号,对活动及其他用户造成了恶劣影响,针对这部分违规用户:1、取消本次活动获奖资格;2、我们将统一审视,将违规情节较为严重的用户列入黑名单中,永久限制参与鲲鹏论坛所有活动。另外,对于这部分用户造成的不良影响,华为云平台将保留通过法律途径维护权益及进一步追究责任的权利。违规名单如下:hw****1684、yc****57、hw****5458、yan****aa、hw****4133、zh****0、hw****2492、zh****hua1026、ya****ng89757、LH****13、Yu****121788、Na****333
  • [技术干货] 鲲鹏离线部署PHP8.0.6环境
    最近单位需要在内网鲲鹏+麒麟V10系统上搭建一个wordpress环境,而wordpress的最新版本要求PHP7.4以上版本,查了一下当前PHP最新版本是8.0.6,索性一步到位。部署的过程中遇到一些问题,发现网上有不少人在问,但是却没有解决方案,因此完成后在此分享给大家,希望以后大家看在此贴的面子上踊跃回答一下我的问题。一、准备工作1. 系统光盘做源安装依赖包yum -y install libxml2 libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel sqlite-devel oniguruma-devellibmcrypt-devel oniguruma-devel两个依赖包没有找到,后面手动安装2. 下载 oniguruma安装包本来考虑编译安装6.9.4版本,结果编译的时候报错了,懒得纠结,直接下载一个6.7版本的rpm包安装完事。下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos-altarch/7/cloud/aarch64/openstack-queens/Packages/o/oniguruma-6.7.0-1.el7.aarch64.rpmoniguruma-devel-6.7.0-1.el7.aarch64.rpm需要安装个依赖yum install libtoollibmcrypt-devel没有安装,但是后续也编译安装完成了,如果有问题的话考虑安装一下3. 不要更新openssl使用系统自带的OpenSSL 1.0.2k版本,否则编译会报错二、编译安装PHP8.0.6官方下载地址https://www.php.net/downloadstar zxvf php-8.0.6.tar.gzcd php-8.0.6用如下参数进行配置:./configure \--enable-mbstring  --disable-mbregex \--enable-ftp  \--enable-gd   \--enable-gd-jis-conv \--enable-mysqlnd \--enable-pdo   \--enable-sockets   \--enable-fpm   \--enable-xml  \--enable-soap  \--enable-pcntl   \--enable-cli   \--with-openssl  \--with-mysqli   \--with-pdo-mysql  \--with-pear   \--with-zlib  \--with-iconv  \--with-curl  接下来就是纠错时间了,错误提示一:(可以提前修改,这样就不会报错了)################################################################In file included from /root/php-8.0.6/Zend/zend.h:357:0,                 from /root/php-8.0.6/main/php.h:31,                 from /root/php-8.0.6/ext/standard/array.c:22:/root/php-8.0.6/ext/standard/array.c: 在函数‘zif_array_sum’中:/root/php-8.0.6/Zend/zend_operators.h:692:2: 错误:无效的‘asm’:invalid operand prefix '%c'  __asm__ goto(  ^/root/php-8.0.6/ext/standard/array.c: 在文件作用域:cc1: 警告:无法识别的命令行选项“-Wno-implicit-fallthrough” [默认启用]make: *** [ext/standard/array.lo] 错误 1################################################################解决办法:(这个修改我参考别人处理其他问题的解决办法来的,不知道会不会产生什么影响,高手可以指点一下)修改/root/php-8.0.6/Zend/zend_operators.h文件ZEND_USE_ASM_ARITHMETIC = 0#################################################################if defined(HAVE_ASM_GOTO) && !__has_feature(memory_sanitizer)#  define ZEND_USE_ASM_ARITHMETIC 0#else#  define ZEND_USE_ASM_ARITHMETIC 0#endif################################################################重新配置这次应该能配置通过了接下来make可能会报错,如果报错就检查一下是不是少某个依赖包或者版本不够新,但是也可能不报,因为准备工作已经比较充分了,不要气馁,warning就不用理会了make clean然后重新来一次,记住每次make失败后都要make clean一下make略过make test,没什么鸟用make install祝你一切顺利最后验证一下:php --versionPHP 8.0.6 (cli) (built: May 20 2021 13:56:37) ( NTS )Copyright (c) The PHP GroupZend Engine v4.0.6, Copyright (c) Zend Technologies三、配置PHP1.cp php.ini-development /usr/local/php/php.inicp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.confcp sapi/fpm/php-fpm /usr/local/bin2.打开 php.ini:vim /usr/local/php/php.ini定位到 cgi.fix_pathinfo= 并将其修改为如下所示:cgi.fix_pathinfo=03. cp sapi/fpm/php-fpm.conf /usr/local/etc/vi /usr/local/etc/php-fpm.conf找到include=NONE/etc/php-fpm.d/*.conf,修改为include=/usr/local/etc/php-fpm.d/*.conf4.开机启动 php-fpmphp-fpm占用的是9000端口php-fpm是独立于web服务器和php之前的一层服务器,所以,我们需要开机启动它开机启动的配置文件是:/etc/rc.local ,加入/usr/local/bin/php-fpm5.配置 Nginx 使其支持 PHP 应用:vim /usr/local/nginx/conf/nginx.conf修改默认的 location 块,使其支持 .php 文件:location / {    root   html;    index  index.php index.html index.htm;}下一步配置来保证对于 .php 文件的请求将被传送到后端的 PHP-FPM 模块, 找到如下内容,取消默认的 PHP 配置块的注释:location ~* \.php$ {            root           html;            fastcgi_pass   127.0.0.1:9000;            fastcgi_index  index.php;            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;            include        fastcgi_params;}并修改为下面的内容location ~* \.php$ {    fastcgi_index   index.php;    fastcgi_pass    127.0.0.1:9000;    include         fastcgi_params;    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;}重启 Nginx。6. 功能测试rm /usr/local/nginx/html/index.htmlecho "<?php phpinfo(); ?>" >> /usr/local/nginx/html/index.php打开浏览器,访问 http://localhost将会显示 phpinfo() 。
  • [热门活动] 5月团长引荐奖励——邀请好友加入CPS,享华为精美实物礼品
    5月团长引荐奖励——邀请好友加入CPS,享华为精美实物礼品奖励内容云推官邀请好友加入CPS推广计划,好友加入云推官即可成为自己的团员,团长方能获得所有团员推荐金额总和的10%奖励(可在官网CPS页面-发送 邀请加入链接)具体楼层如下:奖励条件团员人数≥3奖励明细注:奖品数量有限,如超过3名团长所属团员推广金额满足华为平板门槛,则按照所属团员推荐合计金额排序取前三名,剩余云推官顺延领取下一奖励:华为Watch GT2,以此类推。活动说明1、活动时间 2021.5.01-2021.5.312、本次活动需报名后方可参加,报名流程为:步骤A:扫描下方二维码添加活动负责人企业微信步骤B:发送您已经加入推广的华为云账号步骤C:将“我报名参加团长引荐活动”消息发送给活动负责人,即可完成报名(已添加企业微信的云推官也需要完成步骤C)3、活动由CPS工作人员手工记录团长团员关联关系及推荐数据,以确认团员是由团长邀请加入的(关联的时间一定要早于团员的加入推广时间),云推官可在推广后台看到关联关系4、团员有效推荐金额总和25,000元封顶,即最高获得奖励总价值为2,500元5、奖励发放依据所有团员合计推广金额计算,团长本身推广金额不计入团长引荐奖励活动内6、若团员团长被系统判断为同人状态,则不记为有效邀请,即一旦出现关联无效,则邀请引荐也无效结算时间将在5月推广数据结束后,进行数据核算,预计在6月统计团员数据及发放奖励相关文档:-----华为云奖励推广计划活动规则-----推广指南——三步获得华为云高额返利-----华为云奖励推广计划经验分享 小白也能月入过万 如有更多疑问,扫描下方二维码添加奖励推广计划活动负责人企业微信进行咨询
  • [技术干货] PHP封装的简单连接MongoDB类示例
    1. 封装MongoDB类<?php class MongoDB { private $database; private $mongo; function __construct() { $this->mongo = new MongoClient("mongodb://user:password@server_address:port/admin"); $this->database = $this->mongo->selectDB("data"); } { return $this->database->selectCollection($collection); } //获取所有的集合名 function getCollections() { return $this->database->getCollectionNames(); } //选数据库 function selectDB($db) { $this->database = $this->mongo->selectDB($db); } } 2. 简单调用,insert数据。class DemoController extends CI_Controller { function __construct() { parent::__construct(); //CI中加载类 $this->load->library('mongo_lib', '', 'mongodb'); } //插入一条数据 function create() { $data = array('name'=>'mike','email'=>'abc@163.com); //选择库,shell:user demo_db $this->mongodb->selectDB('demo_db'); //选择集合,db.demo_col.insert(); $rebateCollection = $this->mongodb->getCollection('demo_collection'); $res = $rebateCollection->insert($data); } }
  • [技术干货] php开启mysqli扩展之后如何连接数据库
    Mysqli是php5之后才有的功能,没有开启扩展的朋友可以打开您的php.ini的配置文件。查找下面的语句:;extension=php_mysqli.dll将其修改为:extension=php_mysqli.dll即可。相对于mysql有很多新的特性和优势(1)支持本地绑定、准备(prepare)等语法(2)执行sql语句的错误代码(3)同时执行多个sql(4)另外提供了面向对象的调用接口的方法。下面一一用php实例进行mysqli数据库连接!使用方法一:使用传统的面向过程的方法php代码如下: <?php $connect = mysqli_connect('localhost','root','','volunteer') or die('Unale to connect'); $sql = "select * from vol_msg"; $result = mysqli_query($connect,$sql); while($row = mysqli_fetch_row($result)){ echo $row[0]; } ?> 使用方法二:使用面向对象的方法调用接口(推荐使用)看php代码如下: <?php //创建对象并打开连接,最后一个参数是选择的数据库名称 $mysqli = new mysqli('localhost','root','','volunteer'); //检查连接是否成功 if (mysqli_connect_errno()){ //注意mysqli_connect_error()新特性 die('Unable to connect!'). mysqli_connect_error(); } $sql = "select * from vol_msg"; //执行sql语句,完全面向对象的 $result = $mysqli->query($sql); while($row = $result->fetch_array()){ echo $row[0]; } ?> 以上两个php实例运行的结果完全相同,可以清楚的看到使用mysqli类对象构建数据库连接的优势!
  • [技术干货] PHP同时连接多个mysql数据库示例代码
    实例: <?php $conn1 = mysql_connect("127.0.0.1", "root","root","db1"); mysql_select_db("db1", $conn1); $conn2 = mysql_connect("127.0.0.1", "root","root","db2"); mysql_select_db("db2", $conn2); $sql = "select * from ip"; $query = mysql_query($sql); if($row = mysql_fetch_array($query)) echo $row[0]."\n"; $sql = "select * from web "; $query = mysql_query($sql); if($row = mysql_fetch_array($query)) echo $row[0]; ?> 这段代码存在问题,在程序执行时会报错:PHP Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in ....原因分析:程序开始建立两个数据库链接,函数mysql_query()原型:resource mysql_query ( string $query [, resource $link_identifier ] )向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。在本例中由于没有指定link_identifier,所以,在执行第一条sql时,默认使用的是上一个打开的链接,即$conn2,而实际上第一条sql语句应该使用的是$conn1,所以导致报错,所以为了能够链接多个mysql数据库,可以使用如下方法:方法1:在mysql_query函数中指定所用连接,即: <?php $conn1 = mysql_connect("127.0.0.1", "root","root","db1"); mysql_select_db("Muma", $conn1); $conn2 = mysql_connect("127.0.0.1", "root","root","db2"); mysql_select_db("product", $conn2); $sql = "select * from ip"; $query = mysql_query($sql,$conn1); //添加连接$conn1 if($row = mysql_fetch_array($query)) echo $row[0]."\n"; $sql = "select * from web "; $query = mysql_query($sql, $conn2); if($row = mysql_fetch_array($query)) echo $row[0]; ?> 方法2:在sql语句中关联所用数据库,此时可以省略mysql_query的第二个参数,即: <?php $conn1 = mysql_connect("127.0.0.1", "root","root","db1"); mysql_select_db("db1", $conn1); $conn2 = mysql_connect("127.0.0.1", "root","root","db2"); mysql_select_db("db2", $conn2); $sql = "select * from db1.ip"; //关联数据库 $query = mysql_query($sql); if($row = mysql_fetch_array($query)) echo $row[0]."\n"; $sql = "select * from db2.web "; $query = mysql_query($sql); if($row = mysql_fetch_array($query)) echo $row[0]; ?>
  • [openEuler] 【openEuler】【php插件】缺少php-imap php-pecl-redis 等插件
    【功能模块】【php插件】缺少以下插件php-imapphp-pearphp-pecl-redisphp-pecl-igbinary【操作步骤&问题现象】1、dnf 官方源安装:[root@hw-kp ~]# dnf install --allowerasing --nobest --skip-broken php-embedded php-ldap php-pdo php-process php-cli php-devel php-fpm php-imap php-mbstring php-opcache php-pear php-pecl-redis php-snmp php-xml php-gd php-common php-mysqlnd php-pecl-igbinary php-soap -yLast metadata expiration check: 0:09:10 ago on Tue 13 Apr 2021 04:34:37 PM CST.Package php-embedded-7.2.10-3.oe1.aarch64 is already installed.Package php-ldap-7.2.10-3.oe1.aarch64 is already installed.Package php-pdo-7.2.10-3.oe1.aarch64 is already installed.Package php-process-7.2.10-3.oe1.aarch64 is already installed.Package php-cli-7.2.10-3.oe1.aarch64 is already installed.Package php-devel-7.2.10-3.oe1.aarch64 is already installed.Package php-fpm-7.2.10-3.oe1.aarch64 is already installed.No match for argument: php-imapPackage php-mbstring-7.2.10-3.oe1.aarch64 is already installed.Package php-opcache-7.2.10-3.oe1.aarch64 is already installed.No match for argument: php-pearNo match for argument: php-pecl-redisPackage php-snmp-7.2.10-3.oe1.aarch64 is already installed.Package php-xml-7.2.10-3.oe1.aarch64 is already installed.Package php-gd-7.2.10-3.oe1.aarch64 is already installed.Package php-common-7.2.10-3.oe1.aarch64 is already installed.Package php-mysqlnd-7.2.10-3.oe1.aarch64 is already installed.No match for argument: php-pecl-igbinaryPackage php-soap-7.2.10-3.oe1.aarch64 is already installed.Dependencies resolved.Nothing to do.Complete!2、以下为官方 yum 源:[root@hw-kp ~]# cat /etc/yum.repos.d/openEuler_aarch64.repo#generic-repos is licensed under the Mulan PSL v2.#You can use this software according to the terms and conditions of the Mulan PSL v2.#You may obtain a copy of Mulan PSL v2 at:#    http://license.coscl.org.cn/MulanPSL2#THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR#IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR#PURPOSE.#See the Mulan PSL v2 for more details.[OS]name=OSbaseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/$basearch/enabled=1gpgcheck=1gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler[everything]name=everythingbaseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/everything/$basearch/enabled=1gpgcheck=1gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/everything/$basearch/RPM-GPG-KEY-openEuler[EPOL]name=EPOLbaseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/EPOL/$basearch/enabled=1gpgcheck=1gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler[debuginfo]name=debuginfobaseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/debuginfo/$basearch/enabled=1gpgcheck=1gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/debuginfo/$basearch/RPM-GPG-KEY-openEuler[source]name=sourcebaseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/source/enabled=1gpgcheck=1gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/source/RPM-GPG-KEY-openEuler[update]name=updatebaseurl=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/update/$basearch/enabled=0gpgcheck=1gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler【截图信息】【日志信息】(可选,上传日志内容或者附件)