• [技术干货] 一文详解php、jsp、asp和aspx的区别(小科普)【转载】
    通俗理解PHP通俗:PHP就像“万能胶”,专为快速搭建中小型网站设计。它语法简单(类似C语言),免费且跨平台,适合新手和中小项目,比如博客、论坛。但大型项目可能显得力不从心。典型场景:WordPress、Discuz等开源系统常用PHP开发。JSP通俗:JSP是“Java的网页版”,适合大型企业级应用。它基于Java,能调用强大的Java库(如Spring),性能高且跨平台,但学习成本较高,适合银行、电商等复杂系统。典型场景:淘宝早期架构、金融系统后台。ASP通俗:ASP是“微软的老工具”,只能在Windows服务器上运行,使用VBScript开发,简单但局限大(如安全性差)。现在逐渐被淘汰,主要用于维护旧系统。典型场景:早期的企业内网管理系统。ASPX(ASP.NET)通俗:ASPX是“ASP的升级版”,属于微软.NET家族。它编译执行、效率高,支持C#等高级语言,适合开发高性能的Windows平台应用,比如大型门户网站。典型场景:Stack Overflow、微软官网。深入理解1.底层原理与执行方式PHP通过Zend引擎将代码转换为opcode(中间指令)执行,每次请求需重新解析,适合动态内容但性能低于编译型语言。支持扩展库(如GD图形处理),但数据库接口不统一(MySQL、Oracle需不同驱动。JSP首次请求时编译为Java Servlet(.class文件),后续直接运行,性能接近Java应用。依赖JVM,适合高并发场景。通过JDBC统一访问数据库,与Java生态(如Spring、Hibernate)无缝集成。ASP由IIS服务器解释执行,依赖COM组件和VBScript脚本,效率低且仅支持Windows平台。安全性差(如早期易受SQL注入攻击),代码与HTML混合,维护困难。ASPX(ASP.NET)代码编译为CLR(公共语言运行时)字节码,支持C#、VB.NET等语言,执行效率远超ASP。基于.NET框架,提供控件化开发(如拖拽按钮),分离界面(.aspx)与逻辑(.cs文件),适合大型工程。2.跨平台与生态PHP:支持Linux/Windows,搭配Apache/NGINX+MySQL形成LAMP经典组合,开源生态丰富(如Laravel框架)。JSP:依托Java“一次编写,处处运行”,可在Tomcat、WebLogic等服务器部署,适合混合云环境。ASP/ASPX:ASPX部分支持Linux(.NET Core),但主流仍依赖Windows Server+IIS,商业生态强(如Azure云服务)。3.性能与扩展性编译 vs 解释:JSP和ASPX编译后运行,性能优于PHP/ASP的解释执行。例如,JSP的线程模型比ASP的进程模型更高效。扩展能力:JSP可通过Java类库实现复杂功能(如分布式计算);ASPX借助.NET组件(如Entity Framework)处理企业级数据;PHP依赖第三方扩展(如Redis插件),但架构松散。4.适用场景总结技术适合项目类型优势劣势PHP中小型网站、快速原型开发快、成本低、生态活跃性能有限、大型项目维护难JSP高并发企业系统、金融平台高性能、Java生态整合学习曲线陡峭、部署复杂ASP老旧Windows系统维护简单易上手过时、安全性差、平台局限ASPX高性能Windows应用、微软生态集成控件化开发、企业级功能支持跨平台能力弱(.NET Core除外)
  • [技术干货] 【开发者空间实践指导】搭建WordPress博客平台
    概述案例介绍WordPress是一款个人博客系统,也可以把 WordPress当作一个内容管理系统(CMS)来使用,它是使用PHP语言和MySQL数据库开发的,用户可以在支持PHP和MySQL数据库的服务器上搭建自己的博客。本案例借助开发者空间提供的免费云上资源环境,直观地展示如何在开发者空间部署一套个人博客系统。通过实际操作,让大家深入了解如何通过命令在开发者空间进行资源搭建的流程方法,体验其在应用开发中的优势。适用对象企业个人开发者高校学生案例时间本案例总时长预计60分钟。案例流程说明:用户开通开发者空间;下载WordPress软件包到开发者空间;在开发者空间上构建LNMP环境并运行WordPress网站。资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)开发者空间—云主机2 vCPUs | 4 GB RAM免费60GitCode服务免费免费60开发者空间搭建WordPress博客平台云主机申请本案例中,使用开发者空间为环境搭建平台,开发者空间为开发者提供的免费云上资源环境,方便开发者进行环境搭建和项目部署。登录开发者空间页面,点击“配置云主机”进行云主机申请。搭建LNMP应用运行环境WordPress博客系统最新版本需要PHP7.4和MySQL 8.0或者MariaDB 10.5以上的版本来进行运行, 因此本次操作实战决定采用经典架构环境LNMP,L代表Linux,N代表Nginx,M代表MySQL或者MariaDB,P代表PHP。从官方建议网页中可知,虽然还是可以安装低一点版本的PHP和数据库版本,但官方提示担心各种漏洞而受到威胁,因此肯定按着官方建议,安装所要求的版本。安装Nginx登录云主机之后,在云主机桌面单击鼠标右键,选择“Open Terminal Here”,打开终端。本文章以 root 用户来执行操作命令。云主机登录默认账户为developer,所以理论上在每条命令前使用 sudo才有root权限执行,所以我们可使用命令 sudo -i 直接登录到 root 用户。在终端中输入:sudo -i回车,即可切换到root账户。然后在终端中输入:yum -y install nginx回车,进行nginx安装,待终端出现Complete表示 Nginx 安装完成。以下命令进行启动并设置开机自启动:systemctl start nginxsystemctl enable nginx在云主机的浏览器访问地址http://127.0.0.1/,若Nginx 安装成功,则会显示如下页面。安装MySQL在终端中输入:yum -y install mysql-server回车,待终端出现Complete表示 mysql 安装完成。然后输入:systemctl start mysqld启动mysql。在mysql 8.0的后续版本中,初次安装完成后可使用空密码来登录,输入:mysql -uroot -p回车,在“Enter password”时按回车即可登录。登录mysql后,再执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'Huawei@123';来修改数据库root账户的密码。(本案例使用Huawei@123,开发者可自定义)然后执行:flush privileges;quit刷新并退出mysql。最后在终端中执行:systemctl enable mysqld将数据库设置为开机自启动,然后执行:systemctl status mysqld查看mysql数据库状态显示如下即完成mysql的安装和配置,按ctrl+c退出。安装PHP在终端中输入以下命令:yum -y install php php-tidy php-common php-devel php-pdo php-mysql* php-gd php-ldap php-mbstring php-fpm来安装 PHP 和一些所需的 PHP 扩展,显示如下即表示安装成功。输入:php -v可查看php的版本,然后执行:systemctl start php-fpmsystemctl enable php-fpm来启动php,并将其设置为开机自启动。如果想查看php的监听端口,可通过执行:netstat -l | grep php来查看,执行:grep -v ";\|^$" /etc/php-fpm.d/www.conf | grep listen可从配置文件中可查出具体侦听配置。默认在安装旧的PHP版本后,需要在Nginx中配置好对应的PHP支持,但云主机集成的高版本的yum源安装后,会自动安装好对应的配置支持文件,因此开发者无需自行配置。通过执行:cat /etc/nginx/conf.d/php-fpm.confcat /etc/nginx/default.d/php.conf即可查看对应的配置文件,显示如下。最后测试LNMP的PHP支持,在终端输入:echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/index.php来编辑PHP测试页面,修改完后输入:systemctl reload nginx来对php服务进行重载。使用浏览器访问http://127.0.0.1/index.php,显示如下图页面,说明PHP安装成功。数据库数据初始化登录数据库并创建WordPress系统所用的数据库wordpress和对应的用户wordpressuser,并使用密码Huawei@123。在终端输入:mysql -uroot -p在Enter password处输入root的密码“Huawei@123”,登录数据库后,执行:create database wordpress;创建数据库wordpress,执行:create user 'wordpressuser'@'localhost' identified by 'Huawei@123';创建用户wordpressuser并设置密码为Huawei@123,然后执行:grant all privileges on wordpress.* to 'wordpressuser'@'localhost';来进行授权,最后执行:flush privileges;quit刷新退出即可。然后输入:mysql -uwordpressuser -p回车,使用我们新建的wordpressuser账户登录数据库,密码为“Huawei@123”,登录成功后,输入:show databases;显示如下即完成了数据库的初始化配置。输入:quit退出,至此,WordPress所需要的运行环境已经搭建完毕,接下来可以进行WordPress博客系统的安装。安装并配置WordPress打开WordPress官网的下载页面:https://cn.wordpress.org/download/ ,下载wordpress-6.7.1软件包至本地。跳转到软件包目录。然后输入:cp -a /home/developer/下载/wordpress-6.7.1-zh_CN.zip .将软件包复制到当前目录,然后执行:unzip wordpress-6.7.1-zh_CN.zip来解压zip包,然后执行:mv wordpress /usr/share/nginx/html/chown -R apache:apache /usr/share/nginx/html/wordpress/将解压出来的项目目录移动至nginx页面目录下,并设置目录权限。接下来进行WordPress配置。首先执行:cd /usr/share/nginx/html/wordpress进入到WordPress 项目目录,然后执行:cp -a wp-config-sample.php wp-config.php将wp-config-sample.php文件复制名为wp-config.php的文件用作配置文件,并保留示例配置文件以作备份。然后开始编辑WordPress的配置文件,输入:vim wp-config.php按 “i”进入编辑模式来编辑配置文件,按照下图把DB_NAME(数据库名称)、DB_USER(数据库用户名)、DB_PASSWORD(数据库密码)更改为之前所配置的设置,参数如下:/** The name of the database for WordPress */define( 'DB_NAME', 'wordpress' );/** Database username */define( 'DB_USER', 'wordpressuser' );/** Database password */define( 'DB_PASSWORD', 'Huawei@123' );修改完后,按Esc,输入“:wq”,回车,保存并退出配置文件,然后执行:grep -n "^[a-z]\|^[A-Z]" wp-config.php来查看修改是否成功,显示如下即可。接下来进行安装WordPress。在浏览器地址栏输入http://127.0.0.1/wordpress,即可跳转至安装页面,然后按照提示填写对应的表单信息后,即可点击安装WordPress。若WordPress安装完成,会如下图所示,然后点击登录,输入用户名和密码,即可登录wordpress管理台,可在页面见到网站仪表盘,如下图所示。在浏览器输入http://127.0.0.1/wordpress 即可查看wordpress主页.可以在管理界面选择想要的主题和插件,可使用在线安装的方式进行安装,也可以在线更新各种插件(PS:前提是设置好此前所说的访问权限,不然会弹出授权界面)。安装完成后,点击启用即可使用,并可在已安装插件中查看。至此,已完成整个WordPress项目的部署。更多案例,点击案例中心查看~
  • [技术干货] PHP8.3更新内容新特性及支持版本探究【转】
    支持版本除了庆祝新的版本发布以后,也需要注意一下:PHP 8.0 的生命周期即将结束,PHP 8.0 早已在2022 年 11 月 26 日结束了积极支持,而安全支持也将在 PHP8.3 发布的三天后2023 年 11 月 26 日停止。了解更多信息可查看Supported Versions。新特性PHP 8.3 引入了许多新功能。然而,它的功能比 PHP 8.1 或 PHP 8.2 相对较少。PHP 8.3 的主要新特性:类型化类常量动态类常量获取#[\Override]属性只读修改添加json_validate函数添加Randomizer::getBytesFromString()方法添加Randomizer::getFloat()和Randomizer::nextFloat()方法类型化类常量现在可以在定义常量时,增加类型。 // PHP &lt; 8.3 interface I {     // We may naively assume that the PHP constant is always a string     const PHP = 'PHP 8.2'; }  class Foo implements I {     const PHP = []; // But it may be an array... }  // PHP 8.3 interface I {     const string PHP = 'PHP 8.3'; }  class Foo implements I {     const string PHP = []; }  // Fatal error: Cannot use array as value for class constant Foo::PHP of type string 动态类常量获取在之前的版本中获取类的常量,除了直接调用以外,想要动态获取只能通过拼接后使用constant来实现,而现在可以直接使用变量来获取常量。这个方式在枚举类型中也可以使用。// PHP < 8.3 class Foo {     const PHP = 'PHP 8.2'; } $searchableConstant = 'PHP'; var_dump(constant(Foo::class . "::{$searchableConstant}")); // PHP 8.3 class Foo {     const PHP = 'PHP 8.3'; } $searchableConstant = 'PHP'; var_dump(Foo::{$searchableConstant});添加#[\Override]属性通过给方法添加 #[\Override] 属性,PHP 将确保在父类或实现的接口中存在同名的方法。添加该属性可以清楚地表明重载父类方法是有意为之,并简化了重构过程,因为重载父类方法的删除会被检测到。// PHP < 8.3 use PHPUnit\Framework\TestCase; final class MyTest extends TestCase {     protected $logFile;     protected function setUp(): void     {         $this->logFile = fopen('/tmp/logfile', 'w');     }     protected function taerDown(): void     {         fclose($this->logFile);         unlink('/tmp/logfile');     } } // The log file will never be removed, because the // method name was mistyped (taerDown vs tearDown). // PHP 8.3 use PHPUnit\Framework\TestCase; final class MyTest extends TestCase {     protected $logFile;     protected function setUp(): void     {         $this->logFile = fopen('/tmp/logfile', 'w');     }     #[\Override]     protected function taerDown(): void     {         fclose($this->logFile);         unlink('/tmp/logfile');     } } // Fatal error: MyTest::taerDown() has #[\Override] attribute, // but no matching parent method exists只读修改只读属性现在可以在魔术方法 __clone 方法中修改一次,以实现只读属性的深度克隆。// PHP < 8.3 readonly class Foo {     public \DateTime $dateTime;     function __construct(\DateTime $dateTime) {         $this->dateTime = $dateTime;     }     public function __clone()     {         $this->dateTime = clone $this->dateTime;     } } $today = new Foo(new \DateTime()); $tomorrow = clone $today; // Fatal error: Cannot modify readonly property Foo::$dateTime // PHP 8.3 readonly class Foo {     public \DateTime $dateTime;     function __construct(\DateTime $dateTime) {         $this->dateTime = $dateTime;     }     public function __clone()     {         $this->dateTime = clone $this->dateTime;     } } $today = new Foo(new \DateTime()); $tomorrow = clone $today; $tomorrow->dateTime->modify('+1 day');添加json_validate函数在之前的版本中想要验证一个字符是否是语法上有效的JSON,需要先decode然后判断错误码,而现在可以直接调用json_validate函数。同时 json_validate() 性能比 json_decode() 要好不少,并且使用更加简单。// PHP < 8.3 function json_validate(string $string): bool {     json_decode($string);     return json_last_error() === JSON_ERROR_NONE; } var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true // PHP 8.3 var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true一次 Lint 多个文件PHP CLI 二进制文件的 -l 允许检查 PHP 文件以确保它没有语法错误。以前只允许一次检查一个文件,这意味着如果想检查整个项目,则必须为每个应用程序文件调用一次它。从 PHP 8.3 开始允许传递多个文件。// PHP < 8.3 php -l index.php // PHP 8.3 php -l src/**/*.php
  • [技术干货] PHP实践:获取网络上图片的长宽以及图片类型-转载
     🚀一、前言 在开发Web应用程序中,我们经常需要从网络上获取图片并对其进行处理。有时候,我们可能需要知道图片的长宽和类型信息,以便进行进一步的操作或展示给用户。在PHP中,我们可以使用getimagesize()函数来获取网络图片的长宽和类型信息。 🚀二、实现逻辑 🔎2.1 getimagesize()函数简介 getimagesize()是一个内置函数,用于获取图片的各种属性信息,包括宽度、高度、类型等。该函数可以对本地图片文件或通过URL访问的网络图片进行操作。在本文中,我们将重点介绍如何使用该函数获取网络图片的信息。  🔎2.2 获取网络图片信息的步骤 下面是使用PHP获取网络图片信息的具体步骤:  🍁2.2.1 第一步:获取网络图片的地址 首先,我们需要获取网络图片的地址。假设我们要获取的网络图片地址为https://example.com/image.jpg。  🍁2.2.2 第二步:使用getimagesize()函数获取图片信息 接下来,我们使用getimagesize()函数来获取图片的信息。将网络图片地址作为参数传递给getimagesize()函数,并将返回的结果保存在一个变量中。  $imageUrl = "https://example.com/image.jpg"; $imageInfo = getimagesize($imageUrl); 🍁2.2.3 第三步:提取图片的长、宽和类型 getimagesize()函数返回的结果是一个数组,其中包含了图片的属性信息。我们可以通过索引来访问这些信息。  $imageWidth = $imageInfo[0]; $imageHeight = $imageInfo[1]; $imageMime = $imageInfo['mime']; 🍁2.2.4 第四步:打印结果或进行其他操作 最后,我们可以直接打印出获取到的图片信息,或根据需要进行进一步处理。例如,我们可以将获取到的图片信息展示给用户,或根据图片类型进行相应的处理。  echo "图片宽度:".$imageWidth."px<br>"; echo "图片高度:".$imageHeight."px<br>"; echo "图片类型:".$imageMime; 🚀三、 完整示例代码 下面是获取网络图片信息的完整代码示例:  $imageUrl = "https://www.xxx.com/demo.jpg"; $imageInfo = getimagesize($imageUrl);  $imageWidth = $imageInfo[0]; $imageHeight = $imageInfo[1]; $imageMime = $imageInfo['mime'];  echo "图片宽度:".$imageWidth."px<br>"; echo "图片高度:".$imageHeight."px<br>"; echo "图片类型:".$imageMime; 以上就是使用PHP获取网络图片长宽和类型信息的步骤和代码。  🚀四、演示 下面使用真实的一个图片来演示一下上面的代码。  看到输出如下:  🚀五、 总结 在本文中,我们介绍了如何使用PHP获取网络图片的长宽和类型信息。通过使用getimagesize()函数,我们可以轻松地获取到网络图片的各种属性信息,提供更好的用户体验或进行进一步的处理操作。这个功能非常有用,在开发Web应用程序时经常会遇到。希望本文对大家有所帮助! ———————————————— 版权声明:本文为CSDN博主「黑夜开发者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_21891743/article/details/132466781 
  • [技术干货] PHP+Nginx经常出现502、504原因与解决方法 —转载
     很多新手刚开始做网站可能感觉不到502,504的问题,当等你网站到达了一定水平的时候,流量起来的时候,你会发现经常会遇到502、504类似的问题。  一、什么是502状态码? 502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。  二、502 Bad Gateway 原因一般有哪些? 将请求提交给网关如php-fpm执行,但是由于某些原因没有执行完毕导致php-fpm进程终止执行。这个问题与网关服务如php-fpm的配置有关。  php-fpm.conf配置文件中有两个参数就需要你考虑到,分别是max_children和request_terminate_timeout。  max_children最大子进程数,在高并发请求下,达到php-fpm最大响应数,后续的请求就会出现502错误的。可以通过netstat命令来查看当前连接数。  request_terminate_timeout设置单个请求的超时终止时间。还应该注意到php.ini中的max_execution_time参数。当请求终止时,也会出现502错误的。  当积累了大量的php请求,你重启php-fpm释放资源,但一两分钟不到,502又再次呈现,这是什么原因导致的呢? 这时还应该考虑到数据库,查看下数据库进程是否有大量的locked进程,数据库死锁导致超时,前端终止了继续请求,但是SQL语句还在等待释放锁,这时就要重启数据库服务了或kill掉死锁SQL进程了。  三、什么是504状态码? 504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。  四、504 Gateway Time-out 原因一般有哪些? 504错误一般是与nginx.conf 配置有关。主要与以下几个参数有关:  fastcgi_connect_timeout  fastcgi_send_timeout  fastcgi_read_timeout  fastcgi_buffer_size  fastcgi_buffers  fastcgi_busy_buffers_size  fastcgi_temp_file_write_size  fastcgi_intercept_errors  特别是前三个超时时间。如果fastcgi缓冲区太小会导致fastcgi进程被挂起从而演变为504错误。  五、关于PHP+Nginx经常出现502、504的解决方法 由于不同的原因,解决方法也是不一样的,一定要根据实际的情况去分析。例如,以下是我以前遇到的502的相关问题。  1、Nginx 502 Bad Gateway 原因与解决方法  2、Nginx报错:upstream timed out (110: Connection timed out) 原因与解决方法  今天重点说下我遇到504问题的解决方法。  由于我用的是PHP+Nginx+百度云加速CDN,然后,百度云加速CDN一直给我报504错误,我排查了很多也没有找到原因。  1、最初我以为修改nginx.conf,增加如下“error Connection timed out and 504 error”的代码可以解决这个问题。   [root@localhost /]# vim nginx.confserver {        listen 80;         server_name zabbix.gree.com;         access_log /roobo/logs/nginx/zabbix.gree.com_access.log main;         error_log /roobo/logs/nginx/zabbix.gree.com_error.log error ;         root /roobo/webserver/zabbix;        index index.html index.htm index.php;           location / {             try_files $uri $uri/ /index.php$is_args$args;         }         location ~ \.php$ {             try_files $uri =404;             include fastcgi.conf;             fastcgi_pass 10.7.19.195:9000;         }          #error Connection timed out and 504 error        large_client_header_buffers 4 16k;        client_max_body_size 30m;        client_body_buffer_size 128k;        fastcgi_connect_timeout 300;        fastcgi_read_timeout 300;        fastcgi_send_timeout 300;        fastcgi_buffer_size 64k;        fastcgi_buffers   4 32k;        fastcgi_busy_buffers_size 64k;        fastcgi_temp_file_write_size 64k; } 经过测试,并没有任何效果。  2、我又自信的以为是我用了FirewallD防火墙的原因,结果我关闭它,测试也没有效果,照样报504错误。  3、最后当再出现504错误的时候,我直接暴力操作,杀死php-fpm,再重启,就可以恢复正常,从而我判断是php的问题。经过我的排查,发现是“pm.max_requests”这个参数的问题,我最初设置的是204000,现在设置的是20400即可恢复正常,没有再出现504错误了,平均负载 Load Average也在正常的范围类。  4、但是过一段时间后,又会出现“504连接超时”这个问题。  5、最终,经过我几天的测试,我最终php-fpm.conf参数调整如下即恢复正常:  注意:这里我顺便说一下,我以前配置的参数是 pm.max_spare_servers = 60; pm.max_requests = 204800;   pm = dynamic pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 30 pm.max_requests = 20480 总结:  通俗点讲,设置“pm.max_requests”参数小一点,就是让php-fpm能够自动的频繁重启,关于具体设置多大?要根据你的服务器配置以及流量状况来分析,自己可以去做测试。  经过我的的测试,我发现pm.max_requests设置太大会出现504 Gateway Time-out,pm.max_requests设置太小,平均负载 Load Average又会超出正常值的范围,甚至更高。 ———————————————— 版权声明:本文为CSDN博主「执刀人的工具库」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/winkexin/article/details/130628949 
  • [技术干货] Ansible roles的使用 :安装nginx与php教程
    【Ansible Roles使用教程:安装Nginx与PHP】  Ansible Roles是一种组织和复用Ansible代码的方法,用于将相关的配置和任务组织在一起,使代码更加模块化和易于管理。在本教程中,我将演示如何使用Ansible Roles来安装Nginx和PHP,并在CentOS 7上部署一个简单的Web服务器。  创建Ansible项目目录结构: 首先,创建一个Ansible项目目录,并在其中创建以下目录结构:  ansible-project/ ├── inventory/ │   └── hosts ├── roles/ │   ├── nginx/ │   │   ├── tasks/ │   │   │   └── main.yml │   │   └── templates/ │   │       └── nginx.conf.j2 │   └── php/ │       └── tasks/ │           └── main.yml └── site.yml 编辑hosts文件: 在 inventory/hosts文件中定义要部署Nginx和PHP的目标主机:  [web_servers] server1 ansible_host=服务器IP地址 编辑Nginx角色的main.yml文件: 在 roles/nginx/tasks/main.yml文件中定义安装Nginx的任务:  --- - name: Install Nginx   yum:     name: nginx     state: present - name: Start Nginx   service:     name: nginx     state: started     enabled: yes - name: Copy Nginx configuration file   template:     src: nginx.conf.j2     dest: /etc/nginx/nginx.conf - name: Restart Nginx   service:     name: nginx     state: restarted  编辑PHP角色的main.yml文件: 在 roles/php/tasks/main.yml文件中定义安装PHP的任务:  --- - name: Install PHP   yum:     name: php     state: present - name: Install PHP modules   yum:     name: "{{ item }}"     state: present   with_items:     - php-fpm     - php-mysql     - php-gd     - php-xml - name: Start PHP-FPM   service:     name: php-fpm     state: started     enabled: yes  编辑Nginx配置模板: 在 roles/nginx/templates/nginx.conf.j2文件中定义Nginx的配置模板,可以根据需要自定义Nginx配置。 编辑site.yml文件: 在 site.yml文件中定义整个安装过程,包括目标主机和要安装的角色:  --- - name: Install Nginx and PHP   hosts: web_servers   become: yes   roles:     - nginx     - php 执行部署: 最后,执行部署命令,运行整个Ansible Playbook: ansible-playbook -i inventory/hosts site.yml Ansible将会连接到目标主机并按照定义的Roles顺序安装Nginx和PHP。完成后,你将在目标主机上拥有一个运行Nginx和PHP的简单Web服务器。 通过使用Ansible Roles,你可以更好地组织和管理你的Ansible Playbook,使部署过程更加模块化和可维护。同时,Ansible的自动化能力能够帮助你快速在多台主机上部署相同的配置,提高效率和一致性。 ———————————————— 原文链接:https://blog.csdn.net/tiansyun/article/details/134025613 
  • [技术干货] 多级部署LNMP项目
    多机部署LNMP是一个很重要的项目,L代表Linux系统,N代表Nginx服务, M代表Mysql服务,P代表PHP服务。LNMP平台应该是应用比较广泛的网站服务架构。随着Nginx在企业中的使用越来越多。LNMP架构也受到越来越多的linux系统工程师的青睐。因此,掌握多级部署LNMP是非常重要的。vim lnmp.sh#!/bin/bash#build lnmp#移除原有的yum仓库,并备份到/root/old目录下[-d /root/old] $$rm-rf /root/old;mkdir /root/old || mkdir /root/oldmv /etc/yum.repos.d/* /root/oldcp -r /root/old/*/etc/yum.repos.d/#更新安装epel源rpm -Uvh https://mirror.webtatic.com/yu,/e17/epel-release.rpmsleep 10#更新安装Centos源rpm -Uvh https://mirror.webtatic.com/yum/e17/webtatic-release.rpmyum clean allyum repolistsleep 10#安装依赖软件包yum -y install openssl-devel gcc-c++ gcc makeecho waiting install php......yum install -y php56w-fpm php56w-common pjp56w-mbstring php56w-mcrypt php56w-pdo php56w-mysqlnd php56w-bcmath php56w-xml php56w-ldap#修改相关配置sed -i 's/post_max_size=8M/post_max_size=16M/g' /etc/php.inised -i 's/max_execution_time=30/max_execution_time=300/g'/etc/php.inised -i 's/max_input_time=60/max_execution_time=300/g/etc/php.ini'sed -i 's/listen,allowed_clients=127.0.0.1/#listen.allowed_clients=127.0.0.1/g'/etc/php-fpm.d/www.conf#启动并设置开机自启动systemctl enable php-fpmsystemctl start pho-fpmsleep 10echo waiting for nginxyum -y install nginxnginx -tnginxsleep 10echo waiting for mysql15.6......[-d /usr/local/src]||mkdir -p /usr/local/srccd/usr/local/srcrpm -Uvh http://dev.mysql.com/get/mysql-community-release -e17-5.noarch.rpmyum repolist all |grep ''mysql.*-community.*''yum -y install mysql-community-serversystemctl enable mysqldsystemctl start mysqld.serviceecho $ip >> passwords.txtawk -F:'/temporary password""/{print $NF}' /var/log/mysqld.log>>passwords.txtsleep3以上是在一台服务器上实现部署LNMP,项目需求是要在多态服务器上实现,其思路和多级部署mysql一样,需要使用shell循环来实现多态机器的LNMP部署。vim ip.txt10.0.104.510.0.104.2710.0.104.3410.0.104.13610.0.104.108#!/bin/bash#mainwhile read ipdo{ping -c 1-w 2 $ ip>/dev/nullif [$?-eq 0];thenscp -r lnmp.sh root@ip:/tmp/ssh root@ip "/tmp/lnmp.sh"}&done <ip.txtwaitecho all finish以上代码是针对ip.txt文件中的主机ip地址进行多机部署LNMP。首先是先ping一下ip.txt文件中的ip地址,判断机器是否正常;然后把安装lnmp脚本复制到多态服务器上/tmp/下,远程使用管理员权限,执行安装LNMP脚本,如果显示 all finish 则表示所有服务器安装都已完成。
  • [互动交流] 使用华为Obs官方提供PHP版本SKD上传图片文件报错,频繁出现下列问题导致上传文件失败
    ERROR - 2022-12-07 18:05:29 --> Severity: Warning --> fread(): SSL: Connection reset by peer /dev/third_party/huaweicloud-obs/vendor/guzzlehttp/psr7/src/Stream.php 231ERROR - 2022-12-07 17:32:56 --> Severity: error --> Exception: Argument 1 passed to Obs\ObsClient::Obs\Internal\{closure}() must be an instance of GuzzleHttp\Exception\RequestException, instance of GuzzleHttp\Exception\ConnectException given, called in /dev/third_party/huaweicloud-obs/vendor/guzzlehttp/promises/src/Promise.php on line 204 /dev/third_party/huaweicloud-obs/Obs/Internal/SendRequestTrait.php 640
  • [互动交流] composer 安装后php SDK 下载的目录找不到
    【功能模块】composer  php SDK 安装【操作步骤&问题现象】1、composer require huaweicloud/huaweicloud-sdk-php:3.0.54-rc 安装完成后如下图:1  图:2  代码中的依赖库 sdk 文件加载不上HuaweiCloud\SDK\ 这个文件夹加载不上是哪里没有配置好吗?【截图信息】图:1图:2【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【华为云DWS】【ODBC】PHP ODBC连接公有云上的DWS数据库怎么操作啊
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [互动交流] 【SDK for PHP】composer 安装报错
    composer require obs/esdk-obs-php Using version ^3.21 for obs/esdk-obs-php ./composer.json has been updated Running composer update obs/esdk-obs-php Loading composer repositories with package information Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires obs/esdk-obs-php ^3.21 -> satisfiable by obs/esdk-obs-php[3.21.6]. - obs/esdk-obs-php 3.21.6 requires guzzlehttp/guzzle 6.3.0 -> found guzzlehttp/guzzle[6.3.0] but it conflicts with your root composer.json require (^7.0.1). Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions. Installation failed, reverting ./composer.json and ./composer.lock to their original content.这个问题存在好久了,好多新项目中使用不了SDK,麻烦尽快升级下 guzzlehttp/guzzle 版本吧!
  • [问题求助] 电脑win10下载PHP依赖包不成功
    【功能模块】【操作步骤&问题现象】1、电脑win10下载PHP依赖包不成功2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 有用php做SparkRTC接入鉴权的吗?
    static String hmacSha(String KEY, String VALUE, String SHA_TYPE) { try { SecretKeySpec signingKey = new SecretKeySpec(KEY.getBytes("UTF-8"), SHA_TYPE); Mac mac = Mac.getInstance(SHA_TYPE); mac.init(signingKey); byte[] rawHmac = mac.doFinal(VALUE.getBytes("UTF-8")); byte[] hexArray = { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }; byte[] hexChars = new byte[rawHmac.length * 2]; for (int j = 0; j rawHmac.length; j++) { int v = rawHmac[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } catch (Exception ex) { throw new RuntimeException(ex); } } 用php怎么写?
  • [互动交流] php版本sdk的扩展依赖问题,能否提升一下相关依赖扩展版本
    php版本sdk需要以下扩展"require" : { "php" : ">=5.6.0", "guzzlehttp/guzzle" : "6.3.0", "guzzlehttp/psr7" : "1.4.2", "guzzlehttp/promises" : "1.3.1", "psr/http-message" : "1.0.1", "monolog/monolog" : "1.23.0", "psr/log" : "~1.0"},但是guzzlehttp monolog版本都过低,我开发程序是使用了其他的sdk用于微信支付,支付宝支付,腾讯地图等等都用了guzzle,他们允许使用的版本都相对高一些,比如>=6.3.0或者>7.0,但咱的guzzle只能用6.3.0的版本,导致我因为版本依赖问题,无法安装obs的sdk为了使用obs,我只能强行降低guzzle版本,但是有可能导致我其他扩展无法正常使用,还需要去重新测试我的程序,带来很大的不便
  • [技术干货] Php 和ODBC数据库
    创建 ODBC 连接通过一个 ODBC 连接,您可以连接到您的网络中的任何计算机上的任何数据库,只要 ODBC 连接是可用的。这是创建到达 MS Access 数据库的 ODBC 连接的方法:在控制面板中打开管理工具图标。双击其中的数据源(ODBC)图标。选择系统 DSN 选项卡。点击系统 DSN 选项卡中的添加。选择Microsoft Access Driver。点击完成。在下一个界面,点击选择来定位数据库。为数据库起一个数据源名(DSN)。点击确定。请注意,必须在您的网站所在的计算机上完成这个配置。如果您的计算机上正在运行 Internet 信息服务(IIS),上面的指令将会生效,但是如果您的网站位于远程服务器,您必须拥有对该服务器的物理访问权限,或者请您的主机提供商为您建立 DSN。连接到 ODBCodbc_connect() 函数用于连接到 ODBC 数据源。该函数有四个参数:数据源名、用户名、密码以及可选的指针类型。odbc_exec() 函数用于执行 SQL 语句。实例下面的实例创建了到达名为 northwind 的 DSN 的连接,没有用户名和密码。然后创建并执行一条 SQL 语句:$conn=odbc_connect('northwind','','');$sql="SELECT * FROM customers";$rs=odbc_exec($conn,$sql);取回记录odbc_fetch_row() 函数用于从结果集中返回记录。如果能够返回行,则函数返回 true,否则返回 false。该函数有两个参数:ODBC 结果标识符和可选的行号:odbc_fetch_row($rs)从记录中取回字段odbc_result() 函数用于从记录中读取字段。该函数有两个参数:ODBC 结果标识符和字段编号或名称。下面的代码行从记录中返回第一个字段的值:$compname=odbc_result($rs,1);下面的代码行返回名为 "CompanyName" 的字段的值:$compname=odbc_result($rs,"CompanyName");关闭 ODBC 连接odbc_close() 函数用于关闭 ODBC 连接。odbc_close($conn);ODBC 实例下面的实例展示了如何首先创建一个数据库连接,接着创建一个结果集,然后在 HTML 表格中显示数据。<html><body><?php$conn=odbc_connect('northwind','','');if (!$conn){    exit("连接失败: " . $conn);}$sql="SELECT * FROM customers";$rs=odbc_exec($conn,$sql);if (!$rs){    exit("SQL 语句错误");}echo "<table><tr>";echo "<th>Companyname</th>";echo "<th>Contactname</th></tr>";while (odbc_fetch_row($rs)){    $compname=odbc_result($rs,"CompanyName");    $conname=odbc_result($rs,"ContactName");    echo "<tr><td>$compname</td>";    echo "<td>$conname</td></tr>";}odbc_close($conn);echo "</table>";?></body></html>
总条数:185 到第 页
上滑加载中