Hilarionbet 2500 TL Yılbaşı Çevrimsiz Bonus

Hilarionbet Güncel Giriş: Hızlı Açılan, SEO Uyumlu ve Güven Veren Tek Sayfa

Hilarionbet’e ulaşmak isteyen kullanıcılar için en değerli şey zaman kazanmak ve doğru bağlantıya tereddütsüz gitmektir. Bu sayfa; güncel giriş adresini merkezde tutar, yeni üye kayıt akışını kolaylaştırır ve yılbaşı döneminin öne çıkan fırsatlarını tek ekranda toparlar. Mavi-beyaz tasarım dili, okumayı rahatlatır; sade yapı ise hızlı açılışı destekler.

⚡ Hızlı indexe yatkın yapı
📱 Mobil öncelikli tasarım
🧩 Şema işaretlemeleri
🎁 Yılbaşı bonus vurgusu

Güncel Giriş Nedir ve Neden “Hız” Kadar “Netlik” de Önemlidir?

“Güncel giriş” ifadesi, kullanıcıya basit bir söz verir: doğru adrese ulaşacaksın. İnternet ekosisteminde aynı isme benzeyen sayfalar, eski yönlendirmeler ya da hatalı bağlantılar zaman kaybettirebilir. Bu yüzden güncel giriş mantığı, tek bir doğrulama noktası oluşturur. Kullanıcı açısından avantajı nettir: aradığın bağlantı tek sayfada durur, her seferinde yeniden aramak zorunda kalmazsın.

SEO uyumlu bir sayfanın temelinde “şişirilmiş kelimeler” değil, düzenli bir yapı ve arama motorlarının anlayacağı sinyaller vardır. Bu sayfada başlık hiyerarşisi (H1/H2), kısa paragraflar, anlamlı iç bağlantı akışı ve SSS bölümü bir araya gelir. Ayrıca canonical etiketi, sayfanın ana sürümünü işaret eder; böylece aynı içerik farklı varyasyonlarla dolaşsa bile arama motoruna “esas sayfa budur” mesajı verilir. Bu yaklaşım, hızlı indeksleme için iyi bir zemin oluşturur.

Hilarionbet 2500 TL Yılbaşı Çevrimsiz Bonus: Kampanya Dili Nasıl Okunmalı?

Yılbaşı kampanyaları, kullanıcıların en çok takip ettiği dönemsel fırsatlardandır. “Hilarionbet 2500 TL yılbaşı çevrimsiz bonus” ifadesi, hem dönemsel motivasyonu hem de başlangıç gücünü aynı cümlede toplar. “Çevrimsiz” kelimesi çoğu kullanıcıya daha rahat bir kullanım hissi çağrıştırır; ancak her kampanyanın kendi şartları bulunur. En sağlıklı yöntem, kayıt adımından sonra kampanya koşullarını (uygunluk, süre, limit, kullanım detayları) ilgili bölümde kontrol ederek ilerlemektir.

Bu sayfanın hedefi, kampanyayı abartılı vaatlerle değil; düzenli bilgi akışıyla sunmaktır. Kullanıcı gözünde güven, çoğu zaman tasarım kadar içerik tonu ile de oluşur. Mavi-beyaz arayüz, dikkat dağıtmadan okunabilirlik sağlar; içerik ise “kısa, net ve yönlendirici” cümlelerle yol gösterir.

Yeni Üye ve Yeni Kayıt: Sorunsuz Başlangıç İçin Pratik Öneriler

Yeni üye olmak, bir platformla kurulan ilk temas noktasıdır. Bu teması sağlam tutmak için küçük ama etkili adımlar atılabilir: güçlü bir şifre seçmek, aynı şifreyi başka sitelerde kullanmamak, bilgileri doğru girmek ve giriş yaptığın alan adını kontrol etmek. Bu alışkanlıklar hem hesabını korur hem de ileride yaşanabilecek erişim sorunlarını azaltır.

Mobil kullanıcılar için hız birincil beklentidir. Bu yüzden sayfa; ağır animasyonlardan kaçınan, kart yapısıyla düzenlenen ve butonları her zaman erişilebilir tutan bir tasarıma sahiptir. “Yeni Üye / Kayıt Ol” ve “Giriş Yap” butonları, kullanıcı niyetini bölmeden doğru aksiyona taşır. Böylece sayfa hem bilgi verir hem de dönüşümü destekler.

Not: Kampanyalar dönemsel olarak güncellenebilir. En doğru bilgi için giriş yaptıktan sonra promosyon ekranındaki şartları kontrol et. 18+ ve sorumlu oyun prensiplerini dikkate al.

Sık Sorulan Sorular

Bu sayfa Hilarionbet güncel giriş için ne sağlar?

Güncel bağlantıyı tek yerde toplar, kullanıcıyı eski linkler ve karmaşık yönlendirmeler arasında dolaştırmadan doğru adrese yönlendirir.

2500 TL yılbaşı çevrimsiz bonus nasıl alınır?

Genellikle yeni üyelik oluşturduktan sonra kampanya bölümünden etkinleştirilir. Uygunluk ve koşullar kampanya şartlarında belirtilir.

Yeni üye olurken nelere dikkat etmeliyim?

Alan adını doğrula, güçlü şifre kullan, bilgilerini doğru gir ve mümkünse cihaz/bağlantı güvenliğine dikkat ederek işlem yap.

Sayfa mobilde yavaşsa ne yapabilirim?

Önbelleği temizle, farklı tarayıcı dene veya bağlantını değiştir. Sorun devam ederse destek kanallarına başvur.

Promosyonları nereden görürüm?

Giriş yaptıktan sonra “Promosyonlar / Kampanyalar” bölümünde listelenir. Yılbaşı fırsatları da aynı alanda yer alır.


Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/xiaofan/amp.php:1) in /var/www/html/xiaofan/wp-content/themes/argon/functions.php on line 505

Warning: session_start(): Session cannot be started after headers have already been sent in /var/www/html/xiaofan/wp-content/themes/argon/functions.php on line 512

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/xiaofan/amp.php:1) in /var/www/html/xiaofan/wp-includes/feed-rss2.php on line 8
PHP – 小凡部落 http://xiaofan.hoopan.net 专注网站建设和主机运维,分享最新IT资讯及技术 Wed, 07 Nov 2018 02:45:44 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.9 抢红包利用redis处理高并发 http://xiaofan.hoopan.net/1171.html http://xiaofan.hoopan.net/1171.html#respond Wed, 07 Nov 2018 02:45:44 +0000 http://www.xiaofanblog.com/?p=1171 抢红包的业务流程大概是设置固定金额及数量的红包,比如1.68元20000个、3.8元20000个、8.8元1000个。

考虑高并发的情况下,我们需要有redis消息队列实现,具体方法如下:

1、创建抢红包活动,将5万份红包随机打乱,并放入redis中,使用队列list类型存储

lpush hongbao 每份红包...

2、访客来抢红包,考虑瞬间会有很多用户访问,这边需要对访客做个队列

lpush users 每个用户...

3、有了两个队列,需要跑一个定时任务,给每个用户分配一个红包

rpop users 弹出一个用户,并rpop hongbao 弹出一个红包。分配的结果存入结果队列。分配时还需要判断该用户是否已中奖,因此中奖时可以另外将已中奖用户存入redis的哈希类型。

4、另外一个定时任务去跑结果队列,将结果入库。

 

 

]]>
http://xiaofan.hoopan.net/1171.html/feed 0
sql注入攻击与预防 http://xiaofan.hoopan.net/1166.html http://xiaofan.hoopan.net/1166.html#respond Thu, 28 Jun 2018 08:20:43 +0000 http://www.xiaofanblog.com/?p=1166 一、常用的sql注入方法

1、数字

http://localhost/article.php?id=-1 OR 1=1;

2、字符串

用户登陆

用户名填 admin"#

密码可以随便填

可能拼接的sql语句是

'SELECT * FROM admin WHERE username=admin"#" AND password="123"'

注意:#后面的代码会被注释,因此可以绕过对用户名和密码对判断。

二、常见防御sql注入的方法

1、最有效简单的办法是使用pdo预处理

pdo预处理会对传入的参数进行处理,可以有效防御sql注入

2、对参数进行过滤

数字参数,可以使用is_numeric判断或intval强转

字符串参数,可以使用正则匹配过滤

preg_match('/[a-zA-Z]{6,}/',$usrname);

或者用addslashes对特殊字符转义。

 

]]>
http://xiaofan.hoopan.net/1166.html/feed 0
curl请求范例 http://xiaofan.hoopan.net/1159.html http://xiaofan.hoopan.net/1159.html#respond Thu, 17 May 2018 00:44:03 +0000 http://www.xiaofanblog.com/?p=1159 php的curl请求是非常好用的功能,下面简单写个范例:

function curl_get($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    $response = curl_exec($ch);
    $head_info = curl_getinfo($ch);

    if ($head_info['http_code'] != 200){
        return false;
    }

    return $response;
}

 

]]>
http://xiaofan.hoopan.net/1159.html/feed 0
PHP使用preg_replace_callback函数实现文件内容的批量更换 http://xiaofan.hoopan.net/1109.html http://xiaofan.hoopan.net/1109.html#respond Wed, 10 Jan 2018 07:11:13 +0000 http://www.xiaofanblog.com/?p=1109 最近遇到这样一个小需求:对很多个HTML页面(大概有一百个左右)进行修改,修改里面的评论时间。由于有一定的规律,我就想到了用PHP提供的一些方法进行批量操作。这里用到的是 正则匹配替换函数 preg_replace_callback()。

preg_replace_callback() 与 preg_replace() 很相似,相比来讲 preg_replace_callback() 函数功能更强大,可以使用回调函数对匹配内容进行替换修改。

语法: mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject )

$pattern是正则匹配语句;$callback是回调函数;$subject是要替换的内容。

下面是我的应用实例:

1.下面的这种写法,可以在php5.2版本及以上运行

$content = '<span class="list_item_time">12-12 8:59:11</span> <span class="list_item_time">11-20 12:59:11</span>';
$pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i';
$replace = array('昨天10:21:30', '昨天16:11:58');
function sks_replace($ms)
{
	global $replace;
        static $i = 0;
	$str = $replace[$i];
	$str = '<span class="list_item_time">'. $str. '</span>';
	$i++;
	return $str;
}
$new = preg_replace_callback($pattern,'sks_replace',$content);

2.下面的写法,由于使用到了匿名函数,只能在php5.3以上版本可以运行

$content = '<span class="list_item_time">12-12 8:59:11</span> <span class="list_item_time">11-20 12:59:11</span>';
$pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i';
$replace = array('昨天10:21:30', '昨天16:11:58');
$new = preg_replace_callback(
$pattern,
function($ms)
{
	global $replace;
        static $i = 0;
	$str = $replace[$i];
	$str = '<span class="list_item_time">'. $str. '</span>';
	$i++;
	return $str;
},
$content);

3.以上两种是简单的匹配一个内容 $content,如果有多个内容需要循环匹配替换,就需要代码更复杂一些

以下代码是实现目录结构为下图内容的循环替换

$pro = array('kqky_x', 'nrkc', 'yjs_x', 'yzy', 'pz');

function sks_replace($ms)
{
	//注意这里不能再用静态变量对$j循环了,而是用全局变量
	global $replace, $j;
	$str = $replace[$j];
	$str = '<span class="list_item_time">'. $str. '</span>';
	$j++;
	return $str;
}

foreach($pro as $p)
{
	$file = './'. $p. '.txt';
	if (!is_file($file)){
		echo 'not open '. $file. '<br>';
		continue;
	}
	$replace = file($file);
	foreach($replace as &$value){
		$value = mb_convert_encoding($value, 'utf-8', 'gbk');
	}

	$k = 9;
	for($i = 0; $i < $k; $i++)
	{
		if ($i == 0){
			$i = '';
		}
		$html = '../skswenda'. $i. '/'. $p. '/index.html';
		if ($p == 'pz'){
			$html = '../skswenda/pz'. $i. '/index.html';
			$k = 7;
		}		
		if (!is_file($html)){
			echo 'not open '. $html. '<br>';
			continue;
		}
		$content = file_get_contents($html);
		$pattern = '/<span class=\"list_item_time\">(.*?)?<\/span>/i';
		$j = 0;
		$new = preg_replace_callback($pattern,'sks_replace',$content);
		$handle = fopen($html, 'w');
		fwrite($handle, $new);
		fclose($handle);
	}
}

echo 'replace success';

 

]]>
http://xiaofan.hoopan.net/1109.html/feed 0
PHP重点知识复习 – 高并发之Web服务器的负载均衡 http://xiaofan.hoopan.net/1093.html http://xiaofan.hoopan.net/1093.html#respond Tue, 09 Jan 2018 02:19:57 +0000 http://www.xiaofanblog.com/?p=1093 一、七层负载均衡的实现

基于URL等应用层信息的负载均衡

Nginx的proxy是它一个很强大的功能,实现了7层负载均衡

功能强大、性能卓越、运行稳定

配置简单灵活

能够自动剔除工作不正常的后端服务器

上传文件使用异步模式

支持多种分配策略,可以分配权重,分配方式灵活

1.Nginx负载均衡

内置策略、扩展策略

内置策略:IP Hash、加权轮询

扩展策略:fair策略、通用hash、一致性hash

(1)加权轮询策略

首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器。

当所有后端机器都down掉时,Nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态

(2)IP Hash 策略

Nginx内置的另一个负载均衡的策略,流程和轮询很类似,只有其中的算法和具体的策略有些变化

IP Hash 算法是一种变相的轮询算法

(3)fair策略

根据后端服务器的响应事件判断负载情况,从中选出负载最轻的机器进行分流

(4)通用Hash、一致性Hash策略

通用hash比较简单,可以以Nginx内置的变量为key进行hash,一致性hash采用Nginx内置的一致性hash环,支持memcache

2.Nginx配置

http{
upstream cluster{
server srv1;
server srv2;
server srv3;
}
server {
listen 80;
location /{
proxy_pass http://cluster;
}
}
}

二、四层负载均衡的实现

通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器

LVS实现服务器集群负载均衡由三种方式,NAT,DR和TUN

 

]]>
http://xiaofan.hoopan.net/1093.html/feed 0
PHP重点知识复习 – MySQL数据库层的优化 http://xiaofan.hoopan.net/1085.html http://xiaofan.hoopan.net/1085.html#respond Mon, 08 Jan 2018 13:15:43 +0000 http://www.xiaofanblog.com/?p=1085 一、数据表数据类型优化

1. tinyint、smallint、bigint

考虑空间的问题,考虑范围的问题

2.char、varchar

存储字符串长度是否固定

3.enum

特定、固定的分类可以使用enum存储,效率更快

4.IP地址的存储

使用ip2long()函数,将IP地址转为整型

使用long2ip()函数,将整型转化为IP地址

二、索引的优化

索引的创建原则

索引不是越多越好,在合适的字段上创建合适的索引

复合索引的前缀原则:like查询%问题、全表扫描优化、or条件索引使用情况、字符串类型索引失效的问题

三、SQL语句的优化

1.优化查询过程中的数据访问

使用Limit、返回列不用*

2.优化长难句的查询语句

变复杂为简单、切分查询、分解关联查询、

四、优化特定类型的查询语句

优化count()

优化关联查询

优化子查询

优化Group by 和 distinct

优化limit 和 union

五、存储引擎的优化

尽量使用InnoDB存储引擎

六、数据表结构设计的优化

1.分区操作

通过特定的策略对数据表进行物理拆分

多用户透明

partition by

2.分库分表

水平拆分

垂直拆分

七、数据库架构的优化

主从复制

读写分离

双主热备

负载均衡

八、MySQL的负载均衡

通过LVS的三种基本模式实现负载均衡

MyCat数据库中间件实现负载均衡

 

]]>
http://xiaofan.hoopan.net/1085.html/feed 0
PHP重点知识复习 – 高并发之数据库缓存层的优化 http://xiaofan.hoopan.net/1081.html http://xiaofan.hoopan.net/1081.html#respond Mon, 08 Jan 2018 08:31:09 +0000 http://www.xiaofanblog.com/?p=1081 一、什么是数据库缓存

MySQL等一些常见的关系型数据库的数据都存储再磁盘当中,在高并发场景下,业务应用对MySQL产生的增删改查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。

数据库缓存可以极大地解决数据库服务器的压力,提高应用数据的响应速度。

常见的缓存形式:内存缓存、文件缓存。这里重点讨论内存缓存。

二、为什么要使用缓存

缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程度地降低对数据库服务器的访问压力。

用户请求 --> 数据查询 -->连接数据库服务器并查询数据 -->将数据缓存起来(HTML、内存、JSON、序列化数据)--> 显示给客户端

用户再次请求或者新用户访问 --> 数据查询 --> 直接从缓存中获取数据 --> 显示给客户端

三、MySQL的查询缓存

启用MySQL查询缓存,极大地降低CPU使用率

query_cache_type

查询缓存类型,有0、1、2三个取值。0则不使用查询缓存。1表示始终使用查询缓存。2表示按需使用查询缓存。

query_cache_type为1时,也可以关闭查询缓存

SELECT SQL_NO_CACHE * FROM my_table WHERE condition;

query_cache_type 为2时,也可以按需查询缓存

SELECT SQL_CACHE * FROM my_table WHERE condition;

query_cache_size

默认情况下 query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存

SET GLOBAL query_cache_size = 134217728

注意事项

查询缓存可以看做是SQL文本和查询结果的映射

第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓存

SHOW STATUS LIKE 'Qcache_hits';  查看命中次数

表的结构或数据发生改变时,查询缓存中的数据不再有效

清理缓存

FLUSH QUERY CACHE;  //清理查询缓存内存碎片

RESET QUERY CACHE;  //从查询缓存中移出所有查询

FLUSH TABLES;  //关闭所有打开的表,同时该操作将会清空查询缓存中的内容

四、使用Memcache 缓存查询数据

对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大量请求涌入数据库层,这样对数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要。

memcache是一套分布式的高速缓存系统,由LiveJournal的BradFitzpatrick开发,但目前被许多网站使用以提交网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。

工作原理

Memcache是一个高性能的发布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图片、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。

工作流程

先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中。

方法

获取:get(key)

设置:set(key, val, expire)

删除:delete(key)

通用缓存机制

用查询的方法名+参数作为查询时的key value对中的key值

五、使用Redis缓存查询数据

与Memcache的区别

性能相差不大

Redis在2.0版本后增加了自己的VM特性,突破物理内存的限制,Memcache可以修改最大可用内存,采用LRU算法

Redis 依赖客户端来实现分布式读写

Memcache本身没有数据冗余机制

Redis支持(快照、AOF),依赖快照进行持久化,aof增强了可靠性的同时,也对性能有所影响

Memcache 不支持持久化,通常做缓存,提升性能

Memcache在并发场景下,用cas保证一致性,redis事务支持比较弱,只能保证事务中的每个操作连续执行

Redis支持多种类的数据类型

Redis 用于数据量较小的高性能操作和运算上

Memcache用于在动态系统中减少数据库负载,提升性能;适合做缓存,提高性能

六、缓存其他数据

其他数据

session

session_set_save_handler

 

]]>
http://xiaofan.hoopan.net/1081.html/feed 0
PHP重点知识复习 – 高并发之动态语言层的并发处理 http://xiaofan.hoopan.net/1072.html http://xiaofan.hoopan.net/1072.html#respond Sun, 07 Jan 2018 09:11:44 +0000 http://www.xiaofanblog.com/?p=1072 一、什么是进程、线程、协程

1.进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单元,是操作系统结构的基础。

进程是一个“执行中的程序”

进程的三态模型:多道程序系统中,进程在处理器上交替运行,状态不断地发生变化

运行、就绪、阻塞

运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

阻塞:也成为等待或睡眠状态,一个进程正在等待某一时间发生(例如请求I/O而等待I/O完成等)而暂停停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。

进程的五态模型:对于一个实际的系统,进程的状态及其转换更为复杂

新建态、活跃就绪/静止就绪、运行、活跃阻塞/静止阻塞、终止态

2.线程

由于用户的并发请求,为每一个请求都创建一个进程显然是行不通的,从系统资源开销方面或者响应用户请求的效率方面来看。因此操作系统中线程的概念便被引进了。

线程,有时被称为轻量级进程(Lightweight Process, LWP),是程序执行流的最小单元。

线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元指运行中的程序的调度单位。

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

每个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程的状态:就绪、阻塞、运行

就绪状态:线程具备运行的所有条件,逻辑上可以运行,在等待处理机。

运行状态:线程占用处理机正在运行。

阻塞状态:线程在等待一个事件(如某个信号量),逻辑上不可执行。

3.协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

4.线程与进程的区别

(1)线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间

(2)进程是资源分配和拥有的单元,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单元,但进程不是

(4)二者均可并发执行

(5)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

5.线程与协程的区别

(1)一个线程可以多个协程,一个进程也可以单独拥有多个协程

(2)线程进程都是同步机制,而协程则是异步

(3)协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

6.多进程

同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这就是多进程

比如,我们可以使用手机开启多个APP,可以边玩游戏,边听歌。

多开一个进程,多分配一份资源,进程间通讯不方便

7.多线程

线程就是把一个进程分为很多片,每一片都可以是一个独立的流程

与多进程的区别是只会使用一个进程的资源,线程间可以直接通信

8.举例

单进程单线程:一个人在一个桌子上吃菜

单进程多线程:多个人在同一个桌子上一起吃菜

多进程单线程:多个人每个人在自己的桌子上吃菜

二、同步阻塞

多进程

最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题,一个请求创建一个进程,然后子进程进入循环同步堵塞地与客户端连接进行交互,收发处理数据。

多线程

用多线程模式实现非常简单,线程中可以直接向某一个客户端连接发送数据。

多进程/线程模型的流程是

  • 创建一个 socket,绑定服务器端口(bind),监听端口(listen),在PHP中用stream_socket_server一个函数就能完成上面3个步骤,当然也可以使用更底层的sockets扩展分别实现。
  • 进入while循环,阻塞在accept操作上,等待客户端连接进入。此时程序会进入睡眠状态,直到有新的客户端发起connect到服务器,操作系统会唤醒此进程。accept函数返回客户端连接的socket
  • 主进程在多进程模型下通过fork(php: pcntl_fork)创建子进程,多线程模型下使用pthread_create(php: new Thread)创建子线程。下文如无特殊声明将使用进程同时表示进程/线程。
  • 子进程创建成功后进入while循环,阻塞在recv(php: fread)调用上,等待客户端向服务器发送数据。收到数据后服务器程序进行处理然后使用send(php: fwrite)向客户端发送响应。长连接的服务会持续与客户端交互,而短连接服务一般收到响应就会close。
  • 当客户端连接关闭时,子进程退出并销毁所有资源。主进程会回收掉此子进程。

 

代码实例

缺点

这种模式最大的问题是,进程/线程创建和销毁的开销很大,严重依赖进程的数量解决并发问题。

三、异步非阻塞

现在各种高并发异步IO的服务器程序都是基于epoll实现的。

IO复用异步非阻塞程序使用经典的Reactor模型,Reactor顾名思义就是反应堆的意思,它本身不处理任何数据收发。只是可以监视一个socket句柄的事件变化。

Reactor有4个核心的操作:

  • add添加socket监听到reactor
  • set修改事件监听,可以设置监听的类型,如可读、可写
  • del从reactor中移除,不再监听事件
  • callback就是事件发生后对应的处理逻辑,一般在add/set时制定。C语言用函数指针实现,JS可以用匿名函数,PHP可以用匿名函数、对象方法数组、字符串函数名。

Reactor只是一个事件发生器,实际对socket句柄的操作,如connect/accept、send/recv、close是在callback中完成的。具体编码可参考下面的伪代码:

Reactor模型还可以与多进程、多线程结合起来用,既实现异步非阻塞IO,又利用到多核。目前流行的异步服务器程序都是这样的方式:如

  • Nginx:多进程Reactor
  • Swoole:多线程Reactor+多进程Worker

四、PHP并发编程实践

1.PHP的Swoole扩展

PHP的异步、并行、高性能网络通信引擎,Swoole 使用纯 C 语言编写,提供了 PHP 语言的异步多线程服务器,异步 TCP/UDP 网络客户端,异步 MySQL,异步 Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。

除了异步 IO 的支持之外,Swoole 为 PHP 多进程的模式设计了多个并发数据结构和IPC通信机制,可以大大简化多进程并发编程的工作。其中包括了并发原子计数器,并发 HashTable,Channel,Lock,进程间通信IPC等丰富的功能特性。

Swoole2.0 支持了类似 Go 语言的协程,可以使用完全同步的代码实现异步程序。PHP 代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。

具体使用方法,参考Swoole官网

2.消息队列

消息队列的应用场景:

(1)注册后,短信和邮件发送

场景说明:用户注册后,需要发注册邮件和注册短信

串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信

并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信

消息队列方式:将注册信息写入数据库成功后,将成功信息写入队列,此时直接返回成功给用户,写入队列的时间非常短,可以忽略不计,然后异步发送邮件和短信

(2)应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。

假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。这种情况是订单系统与库存系统耦合。

引用队列

用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

(3)流量削锋

应用场景:秒杀活动,流量瞬间激增,服务器压力大。

用户发送请求,服务器接受后,先写入消息队列。假如消息队列长度超过最大值,则直接报错或提示用户。

这样做可以控制请求量、缓解高流量。

(4)日志处理

应用场景:解决大量日志的传输

日志采集程序将程序写入消息队列,然后通过日志处理程序的订阅消费日志

(5)消息通讯

应用场景:聊天室

多个客户端订阅同一主题,进行消息发布和接收

常见消息队列产品:

Kafka、ActiveMQ、ZeroMQ、RabbitMQ、Redis等

3.接口的并发请求

curl_multi_init

 

此部分内容,还可以参考 Swoole作者韩天峰的一篇博文 《PHP并发IO编程之路》

 

]]>
http://xiaofan.hoopan.net/1072.html/feed 0
PHP重点知识复习 – 高并发之动态语言静态化 http://xiaofan.hoopan.net/1069.html http://xiaofan.hoopan.net/1069.html#respond Sun, 07 Jan 2018 06:23:41 +0000 http://www.xiaofanblog.com/?p=1069 1.什么是动态语言静态化

将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程。

对实时性要求不高的页面

2.为什么要静态化

原因:

动态脚本通常会做逻辑计算和数据查询,访问量较大,服务器压力越大

访问量大时可能会造成CPU负载过高,数据库服务器压力过大

静态化可以减低逻辑处理压力,降低数据库服务器查询压力

3.静态化的实现方式

(1)使用模板引擎

可以使用Smarty的缓存机制生成静态HTML缓存文件

$smarty->cache_dir = $ROOT."/cache";  //缓存目录

$smarty->caching = true;  //是否开启缓存

$smarty->cache_lifetime = "3600";  //缓存时间

$smarty->display(string template[, string cache_id[, string compile_id]]);

$smarty->clear_all_cache();  //清除所有缓存

$smarty->clear_cache('file.html');  //清除指定的缓存

$smarty->clear_chache('article.html', $art_id);  //清除同一个模板下的指定缓存号的缓存

(2)利用ob系列的函数

理解ob系列函数的操作方法,会更容易理解Smarty缓存的原理。

ob_start():打开输出控制缓冲

ob_get_contents():返回输出缓冲区内容

ob_clean():清空输出缓冲区

ob_end_flush():冲刷出(送出)输出缓冲区内容并关闭缓冲

可以判断文件的inode修改时间,判断是否过期

使用 filemtime 函数

以下是一个ob函数的栗子:

<?php

$id = $_GET['id'];

if (empty($id)){
	$id = '';
}

$cache_name = md5(__FILE__). '-'. $id. '.html';

$cache_lifetime = 3600;

if (file_exists($cache_name) && filemtime(__FILE__) <= filemtime($cache_name) && filemtime($cache_name) + $cache_lifetime > time() ){
	include $cache_name;
	exit;
}

ob_start();

?>

<p>aaaThis is Script id = <?php echo $id; ?></p>

<?php

$content = ob_get_contents();

ob_end_flush();

$handle = fopen($cache_name, 'w');

fwrite($handle, $content);

fclose($handle);

?>

 

]]>
http://xiaofan.hoopan.net/1069.html/feed 0
PHP重点知识 – 高并发之建立独立的图片服务器 http://xiaofan.hoopan.net/1067.html http://xiaofan.hoopan.net/1067.html#respond Sun, 07 Jan 2018 05:28:11 +0000 http://www.xiaofanblog.com/?p=1067 1.建立独立的图片服务器的必要性

分担Web服务器的I/O负载 - 将耗费资源的图片服务分离出来,提高服务器的性能和稳定性

能够专门对图片服务器进行优化 - 为图片服务设置有针对性的缓存方案,减少带带宽成本,提高访问速度

提高网站的可扩展性 - 通过增加图片服务器,提高图片吞吐能力

2.采用独立域名

同一个域名下浏览器的并发连接数有限制,突破浏览器连接数的限制

由于cookie的原因,对缓存不利,大部分Web cache都只缓存不带cookie的请求,导致每次的图片请求都不能命中cache

3.独立后的问题

如何进行图片上传和图片同步

NFS 共享方式

利用FTP同步

 

]]>
http://xiaofan.hoopan.net/1067.html/feed 0