首页 开发编程 正文

php单例怎么使用

到现在为止依旧有很多论坛系统是使用DZ开源代码直接部署或二次开发的。DZ论坛操作出现502错误的原因上面说到了,DZ出现502超时错误的解决方案1、PHP配置参数调优PHP脚本运行是有时间限制的,2、调整Nginx/Apache这类Web容器的超时时间充置像IIS/Nginx/Apache默认情况下是不支持PHP脚本的,之所以感觉PH...

php单例怎么使用,dz论坛后台删除未审核帖子502?

早些年的站长朋友们应该都听说过DZ,到现在为止依旧有很多论坛系统是使用DZ开源代码直接部署或二次开发的。DZ从用户功能及体验上来说是很不错的,但并不代表它的技术实现方案就是最优的,最直观的感受就是,数据量一大,论坛可能就会出现一些问题。

DZ论坛是啥?

DZ是Discuz!系统的简称,它是基于PHP+MySQL技术开发的一套通用的社区论坛系统,通过它可以快捷搭建出属于自己的论坛。现在很多地方论坛其实都是用它这个系统的。

DZ论坛操作出现502错误的原因

上面说到了,DZ论坛虽应用广泛,但在大数据量的情况下可能会出现一些问题,比如502超时现象。DZ出现502错误的原因有哪些?

1、单表数据量过大导致的SQL查询超时;

2、PHP配置参数未调优,一旦PHP脚本运行时间较长则出现超时;

3、Nging或Apache这类Web容器的超时时间设置过短等。

DZ出现502超时错误的解决方案

1、PHP配置参数调优

PHP脚本运行是有时间限制的,脚本运行时间一旦超过这个时间就会抛出502错误,因此我们需要适当调高以下这些参数:

PHP配置文件(php.ini)中的 max_execution_time

php-fpm配置文件(php-fpm.conf)中的 request_terminate_timeout

同时开启php-fpm配置中的 request_slowlog_timeout ,此参数配置后可以将PHP执行慢的语句记录下来。

2、调整Nginx/Apache这类Web容器的超时时间充置

像IIS/Nginx/Apache默认情况下是不支持PHP脚本的,之所以感觉PHP是在它们中运行的其实是因为这类Web容器使用Fast-CGI等技术来处理PHP请求的。

以Nginx为例,同样也是有超时时间限制的,主要参数有:proxy_connect_timeout 、proxy_read_timeout 、proxy_send_timeout 。

3、检查MySQL中单表数据量是否过大

MySQL默认的配置参数只是通用型的,一旦MySQL数据量过大我们则要适时调整MySQL的配置项,另外要做慢查询分析,看看是哪些SQL执行速度慢,另外可以考虑做分表。

4、建议使用NoSQL(Redis)来缓存热点数据

对于论坛型应用,是典型的读多写少,我们可以用Redis来将热门贴子数据缓存下来,这样就避免了来回查库带来的性能开销,速度会变得很快。

以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

服务器linux环境运行php?

以centos7为例,模式为lnmp。(使用root用户登录)

更新阿里云yum源

1、进入源目录

# cd /etc/

yum.repos.d/

2、备份原repo文件

# for name in `ls`; do mv $name ${name}.bak ; done

3、下载阿里云yum源

# curl

http://mirrors.aliyun.com/repo/Centos-7.repo > Centos-7.repo

4、清理并生成缓存并安装epel

nginx安装

1、安装pcre,可以支持rewrite功能。

# yum install pcre*

2、安装openssl,可以支持ssl功能

# yum install openssl*

3、从官网下载稳定版,此时是1.16.1,然后解压(如果没有wget ,请执行yum install wget)

# cd /usr/local/src

# wget http://nginx.org/download/nginx-1.16.1.tar.gz

# tar -zxvf nginx-

1.16.1.tar.gz

# cd nginx-1.16.1

4、安装软件三板斧(./configure , make , make install)。

# ./configure --prefix=/usr/local/nginx-1.16.1 --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre

# make

# make install

5、centos7防火墙打开http, https

# firewall-cmd --zone=public --add-service=http --permanent

# firewall-cmd --zone=public --add-service=https --permanent

# firewall-cmd --reload

6、启动nginx

# /usr/local/nginx-1.16.1/sbin/nginx

当通过你系统的IP地址访问出现如下画面,则安装成功

关闭nginx:

# /usr/local/nginx-1.16.1/sbin/nginx -s stop

当改变了nginx.conf后,要重置:

# /usr/local/nginx-1.16.1/sbin/nginx -s reload

安装php和php-fpm

1、安装php7,这里选择php70w,需更新webtatic源

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# yum install php70w

2、安装php扩展,这里以xml扩展示例,你也可以使用yum list php70w*查看所有扩展。

#yum install php70w-xml

3、查看安装结果

#php -v (查看版本)

#php -m (查看扩展)

4、安装php-fpm,(这个与nginx一起使用来解析PHP脚本的)

#yum install php70w-fpm

5、启动php-fpm,并加入开机启动

# systemctl start php-fpm

# systemctl enable php-fpm

6、新建www用户

# useradd www -s /sbin/nologin

7、修改nginx.conf,加入php解析

第2行

第45行

第65-71行改成如下图所示:

8、将html目录所有者改为www,并将权限改为755

# chown -Rf www:www /usr/local/nginx-1.16.1/html

# chmod -Rf 755 /usr/local/nginx-1.16.1/html

9、重启nginx看到如下结果,即配置成功

# /usr/local/nginx-1.16.1/sbin/nginx -s reload

nx函数用法?

在 Redis 里,所谓 SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果,不过很多人没有意识到 SETNX 有陷阱!

比如说:某个查询数据库的接口,因为调用量比较大,所以加了缓存,并设定缓存过期后刷新,问题是当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,大量并发请求会穿透缓存直接查询数据库,造成雪崩效应,如果有锁机制,那么就可以控制只有一个请求去更新缓存,其它的请求视情况要么等待,要么使用过期的缓存。

下面以目前 PHP 社区里最流行的 PHPRedis 扩展为例,实现一段演示代码:

<?php

$ok = $redis->setNX($key, $value);

if ($ok) {

$cache->update();

$redis->del($key);

}

?>

缓存过期时,通过 SetNX 获取锁,如果成功了,那么更新缓存,然后删除锁。看上去逻辑非常简单,可惜有问题:如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防不测:

<?php

$redis->multi();

$redis->setNX($key, $value);

$redis->expire($key, $ttl);

$redis->exec();

?>

因为 SetNX 不具备设置过期时间的功能,所以我们需要借助 Expire 来设置,同时我们需要把两者用 Multi/Exec 包裹起来以确保请求的原子性,以免 SetNX 成功了 Expire 却失败了。 可惜还有问题:当多个请求到达时,虽然只有一个请求的 SetNX 可以成功,但是任何一个请求的 Expire 却都可以成功,如此就意味着即便获取不到锁,也可以刷新过期时间,如果请求比较密集的话,那么过期时间会一直被刷新,导致锁一直有效。于是乎我们需要在保证原子性的同时,有条件的执行 Expire,接着便有了如下 Lua 代码:

local key = KEYS[1]

local value = KEYS[2]

local ttl = KEYS[3]

local ok = redis.call('setnx', key, value)

if ok == 1 then

redis.call('expire', key, ttl)

end

return ok

没想到实现一个看起来很简单的功能还要用到 Lua 脚本,着实有些麻烦。其实 Redis 已经考虑到了大家的疾苦,从 2.6.12 起,SET 涵盖了 SETEX 的功能,并且 SET 本身已经包含了设置过期时间的功能,也就是说,我们前面需要的功能只用 SET 就可以实现。

<?php

$ok = $redis->set($key, $value, array('nx', 'ex' => $ttl));

if ($ok) {

$cache->update();

$redis->del($key);

}

?>

如上代码是完美的吗?答案是还差一点!设想一下,如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创建的锁的情况,所以我们在创建锁的时候需要引入一个随机值:

<?php

$ok = $redis->set($key, $random, array('nx', 'ex' => $ttl));

if ($ok) {

$cache->update();

if ($redis->get($key) == $random) {

$redis->del($key);

}

}

?>

要怎么样才能做出一个软件的样子呢?

首先讲下语言做个软件的样纸的过程:

C语言做出一个图形化界面是其实基础水平就可以实现的。

推荐新手学习的基础图形库 easyx图形库,我目前教学用的就是这个,新手容易上手。在这里给你展示下我的课程项目案例

1.推箱子

推箱子控制台也是可以实现的,学习完这个图形库后可以转换为图形化的,然后加上三维数组就可以实现多关卡,再加上音乐播放就可以播放音乐了。

2.飞翔的小鸟

飞翔的小鸟是鼠标操作的,在这里实现我改为了按键操作的游戏。在播放音乐的地方采用的是多线程去播放,这个稍微需要一定的学习知识库。

相对于来说是还原度比较高的哦

真正C/C++开发的界面框架

MFC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。利用这个可以很方便完成界面,不过需要你熟悉掌握C/C++基础。

MFC创建一个对话框程序,不过逻辑交互代码还是需要自己手写的。

ps:由于MFC 学习难度大,上手难,目前不是很流行。

Qt:Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

QT创建一个窗口:

ps:还有其他界面设计的工具也可以自行了解下,例如:Duilib,SOUI等

接下来我们讲下java中的图形界面

关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下程序是为了方便用户使用的,Java引入图形化界面编程。

1.JFrame 是容器类

2.AWT 是抽象窗口组件工具包,是 Java 最早的用于编写图形节目应用程序的开发包。

3.Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的。

Java提供了三个主要包 做GUI开发:

java.awt 包 – 主要提供字体/布局管理器

javax.swing 包[商业开发常用] – 主要提供各种组件(窗口/按钮/文本框)

java.awt.event 包 – 事件处理,后台功能的实现。

界面主要包括:

组件/控件 – 就是界面中的各种组成部分,比如:按钮、文本框、标签、表格…

容器 – 容器也是组件的一种,能容纳其它组件,比如:窗口、面板

布局管理器 – 组件在容器中的大小和位置由 布局管理器 控制。

尾言

本人未从事过java开发,也未曾深入去了解研习java,故在java不过多做介绍。

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。如果想要学习C/C++,不妨关注下人人都可以学习的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。

一行代码可以做什么?

这里以python为例,简单介绍一下一行代码可以做什么,实验环境win10+python3.6,主要内容如下:

1.绘制“Love”字符串组成的心形图,打开cmd窗口,输入python,进入python shell环境,输入代码 print('\n'.join([''.join([('Love'[(x-y)%4]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))便可绘制出心型,程序运行截图如下:

2.绘制mandelbrot图形,代码 print('\n'.join([''.join(['*'if abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40))<2 else' 'for x in range(-80,20)])for y in range(-20,20)])),程序运行截图如下:

3.输出九九乘法表,代码 print('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)])),程序运行截图如下:

4.输出1-1000的素数,代码 print(*(i for i in range(2, 1000) if all(tuple(i%j for j in range(2, int(i**.5)))))),程序运行截图如下:

5.简单计算器,实现四则运算,代码 print(eval(input())),程序运行截图如下:

6.查看漫画,这里需要先“pip install antigravity”,然后运行代码 import antigravity便可自动打开浏览器查看漫画,如下:

浏览器中漫画如下:

7.最后再来一个python之禅,代码 import this,程序运行如下:

就介绍这几个吧,其实还有许多其他的,网上也有相关教程,可以搜搜,希望以上分析的内容能对你有所帮助吧。

本文转载自互联网,如有侵权,联系删除