梦幻书涯 - 莫問前路遙遠- 與君風雪
X  
登录

还没有账号? 立即注册

忘记密码?
登陆
X  
注册

已经有账号? 马上登陆

获取验证码
重新获取(60s)
立即注册
统计
  • 建站日期:22-09:01
  • 文章总数:80 篇
  • 评论总数:2 条
  • 分类总数:8 个
  • 最后更新:2024年07月05日
PHP并发Curl函数

<pre class="language-php"><code>&lt;?php // 创建一对cURL资源 $ch1 = curl_init(); $ch2 = curl_init(); // 设置URL和相应的选项 curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); // 创建批处理cURL句柄 $mh = curl_multi_init(); // 增加2个句柄 curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; // 执行批处理句柄 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active &amp;&amp; $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 关闭全部句柄 curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); ?&gt;</code></pre> <pre class="language-php"><code></code></pre>...

PHP CURL CURLOPT的参数说明

这篇文章主要介绍了PHP CURL CURLOPT参数,需要的朋友可以参考下 CURLOPT_RETURNTRANSFER 选项: curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 如果成功只将结果返回,不自动输出任何内容。 如果失败返回FALSE curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); 或着不使用这个选项: 如果成功只返回TRUE,自动输出返回的内容。 如果失败返回FALSE PHP中CURL方法curl_setopt()函数的一些参数 . bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值。 下列选项的值将被作为长整形使用(在option参数中指定): • CURLOPT_INFILESIZE : 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。 • CURLOPT_VERBOSE : 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。 • CURLOPT_HEADER : 如果你想把一个头包含在输出中,设置这个选项为一个非零值。 • CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。 • CURLOPT_NOBODY : 如果你不想在输出中包含body部分,设置这个选项为一个非零值。 • CURLOPT_FAILONERROR : 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。 • CURLOPT_UPLOAD: 如果你想让PHP为上传做准备,设置这个选项为一个非零值。 • CURLOPT_POST : 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。 • CURLOPT_FTPLISTONLY : 设置这个选项为非零值,PHP将列出FTP的目录名列表。 • CURLOPT_FTPAPPEND : 设置这个选项为一个非零值,PHP将应用远程文件代替覆盖它。 • CURLOPT_NETRC : 设置这个选项为一个非零值,PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。 • CURLOPT_FOLLOWLOCATION : 设置这个选项为一个非零值(象 “Location: “)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 “Location: “的头)。 • CURLOPT_PUT : 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项. • CURLOPT_MUTE : 设置这个选项为一个非零值,PHP对于CURL函数将完全沉默。 • CURLOPT_TIMEOUT : 设置一个长整形数,作为最大延续多少秒。 • CURLOPT_LOW_SPEED_LIMIT: 设置一个长整形数,控制传送多少字节。 • CURLOPT_LOW_SPEED_TIME : 设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。 • CURLOPT_RESUME_FROM : 传递一个包含字节偏移地址的长整形参数,(你想转移到的开始表单)。 • CURLOPT_SSLVERSION: 传递一个包含SSL版本的长参数。默认PHP将被它自己努力的确定,在更多的安全中你必须手工设置。 • CURLOPT_TIMECONDITION : 传递一个长参数,指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。这仅用于HTTP。 • CURLOPT_TIMEVALUE : 传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用,或被默认TIMECOND_IFMODSINCE使用。 下列选项的值将被作为字符串: • CURLOPT_URL: 这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。 • CURLOPT_USERPWD : 传递一个形如[username]:[password]风格的字符串,作用PHP去连接。 • CURLOPT_PROXYUSERPWD : 传递一个形如[username]:[password] 格式的字符串去连接HTTP代理。 • CURLOPT_RANGE : 传递一个你想指定的范围。它应该是”X-Y”格式,X或Y是被除外的。HTTP传送同样支持几个间隔,用逗句来分隔(X-Y,N-M)。 • CURLOPT_POSTFIELDS : 传递一个作为HTTP “POST”操作的所有数据的字符串。 • CURLOPT_REFERER: 在HTTP请求中包含一个”referer”头的字符串。 • CURLOPT_USERAGENT : 在HTTP请求中包含一个”user-agent”头的字符串。 • CURLOPT_FTPPORT: 传递一个包含被ftp “POST”指令使用的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。这个字符串可以是一个IP地址,一个主机名,一个网络界面名(在UNIX下),或是‘-'(使用系统默认IP地址)。 • CURLOPT_COOKIE : 传递一个包含HTTP cookie的头连接。 • CURLOPT_SSLCERT : 传递一个包含PEM格式证书的字符串。 • CURLOPT_SSLCERTPASSWD : 传递一个包含使用CURLOPT_SSLCERT证书必需的密码。 • CURLOPT_COOKIEFILE : 传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式,或是堆存在文件中的HTTP风格的头。 • CURLOPT_CUSTOMREQUEST : 当进行HTTP请求时,传递一个字符被GET或HEAD使用。为进行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request. 注意: 在确认你的服务器支持命令先不要去这样做。下列的选项要求一个文件描述(通过使用fopen()函数获得): • CURLOPT_FILE: 这个文件将是你放置传送的输出文件,默认是STDOUT. • CURLOPT_INFILE : 这个文件是你传送过来的输入文件。 • CURLOPT_WRITEHEADER : 这个文件写有你输出的头部分。 • CURLOPT_STDERR : 这个文件写有错误而不是stderr。用来获取需要登录的页面的例子,当前做法是每次或许都登录一次,有需要的人再做改进了....

PHP中curl_multi并发详解

<p class="md-end-block md-p"><span class="md-plain md-expand">本文实例讲述了PHP curl批处理及多请求并发实现方法。分享给大家供大家参考,具体如下:</span></p> <p class="md-end-block md-p"><span class="md-plain">在面试过程中遇到一个问题,加入一个一个网站访问一次需要两秒,我们如何实现在2秒左右请求三次?</span></p> <p class="md-end-block md-p"><span class="md-plain">面试官想问的就是如何使用curl并发处理请求</span></p> <h3 cid="n7" mdtype="heading" class="md-end-block md-heading"><span class="md-pair-s "><strong><span class="md-plain">关于curl_multi_init()</span></strong></span></h3> <p class="md-end-block md-p"><span class="md-plain">一般来说,想到要用curl_multi_init()时,目的是要同时请求多个url,而不是一个一个依次请求,否则就要curl_init()了。</span></p> <p class="md-end-block md-p"><span class="md-plain">不过,在使用curl_multi的时候,你可能遇到cpu消耗过高、网页假死等现象,可以看看《PHP使用curl_multi_select解决curl_multi网页假死问题》</span></p> <h3 cid="n10" mdtype="heading" class="md-end-block md-heading"><span class="md-pair-s "><strong><span class="md-plain">使用curl_multi的步骤总结如下:</span></strong></span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">第一步:调用</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_init</code></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">第二步:循环调用</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_add_handle</code></span></p> <p class="md-end-block md-p"><span class="md-plain">这一步需要注意的是,</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_add_handle</code></span><span class="md-plain">的第二个参数是由curl_init而来的子handle。</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">第三步:持续调用</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_exec</code></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">第四步:根据需要循环调用</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_getcontent</code></span><span class="md-plain">获取结果</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">第五步:调用</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_remove_handle</code></span><span class="md-plain">,并为每个字handle调用</span><span class="md-pair-s" spellcheck="false"><code>curl_close</code></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">第六步:调用</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_close</code></span></p> </li> </ul> <h3 cid="n25" mdtype="heading" class="md-end-block md-heading"><span class="md-pair-s "><strong><span class="md-plain">各函数作用解释:</span></strong></span></h3> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_init()</span> </strong></span><span class="md-plain"> 初始化一个curl批处理句柄资源。</span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_add_handle()</span> </strong></span><span class="md-plain"> 向curl批处理会话中添加单独的curl句柄资源。</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_add_handle()</code></span><span class="md-plain">函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。</span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_exec()</span> </strong></span><span class="md-plain"> 解析一个curl批处理句柄,</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_exec()</code></span><span class="md-plain">函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。</span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_remove_handle()</span> </strong></span><span class="md-plain"> 移除curl批处理句柄资源中的某个句柄资源,</span><span class="md-pair-s" spellcheck="false"><code>curl_multi_remove_handle()</code></span><span class="md-plain">函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。</span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_close()</span> </strong></span><span class="md-plain"> 关闭一个批处理句柄资源。</span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_getcontent()</span> </strong></span><span class="md-plain"> 在设置了</span><span class="md-pair-s" spellcheck="false"><code>CURLOPT_RETURNTRANSFER</code></span><span class="md-plain">的情况下,返回获取的输出的文本流。</span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">curl_multi_info_read()</span> </strong></span><span class="md-plain"> 获取当前解析的curl的相关传输信息。</span></p> <p class="md-end-block md-p"><span class="md-plain">示例代码:</span></p> <p class="md-end-block md-p"><span class="md-plain">~~~</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" spellcheck="false"><!--?php<br /-->// 创建一对cURL资源<br />$ch1 = curl_init();<br />$ch2 = curl_init();<br />// 设置URL和相应的选项<br />curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");<br />curl_setopt($ch1, CURLOPT_HEADER, 0);<br />curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");<br />curl_setopt($ch2, CURLOPT_HEADER, 0);<br />// 创建批处理cURL句柄<br />$mh = curl_multi_init();<br />// 增加2个句柄<br />curl_multi_add_handle($mh,$ch1);<br />curl_multi_add_handle($mh,$ch2);<br />$running=null;<br />// 执行批处理句柄<br />do {<br />&nbsp; usleep(10000);<br />&nbsp; curl_multi_exec($mh,$running);<br />} while ($running &gt; 0);<br />// 关闭全部句柄<br />curl_multi_remove_handle($mh, $ch1);<br />curl_multi_remove_handle($mh, $ch2);<br />curl_multi_close($mh);<br />?&gt;</pre> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">获取批处理后的结果:</span></p> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">~~~</span></p> <h3 cid="n0" mdtype="heading" class="md-end-block md-heading md-focus"></h3> <h3 cid="n0" mdtype="heading" class="md-end-block md-heading md-focus"><span class="md-plain md-expand">curl普通请求</span></h3> <pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="php" spellcheck="false"><span role="presentation"><span class="cm-variable-2">$startTime</span> <span class="cm-operator">=</span> <span class="cm-builtin">microtime</span>(<span class="cm-atom">true</span>);</span><br /><span role="presentation"><span class="cm-variable-2">$chArr</span> <span class="cm-operator">=</span> [];</span><br /><span role="presentation"><span class="cm-variable-2">$optArr</span> <span class="cm-operator">=</span> [</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable">CURLOPT_URL</span> <span class="cm-operator">=&gt;</span> <span class="cm-string">'http://www.httpbin.org/ip'</span>,</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable">CURLOPT_HEADER</span> <span class="cm-operator">=&gt;</span> <span class="cm-number">0</span>,</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable">CURLOPT_RETURNTRANSFER</span> <span class="cm-operator">=&gt;</span> <span class="cm-number">1</span>,</span><br /><span role="presentation">];</span><br /><span role="presentation"><span class="cm-variable-2">$result</span> <span class="cm-operator">=</span> [];</span><br /><span role="presentation">​</span><br /><span role="presentation"><span class="cm-comment">//创建多个curl资源并执行</span></span><br /><span role="presentation"><span class="cm-keyword">for</span> (<span class="cm-variable-2">$i</span><span class="cm-operator">=</span><span class="cm-number">0</span>; <span class="cm-variable-2">$i</span><span class="cm-operator">&lt;</span><span class="cm-number">10</span>; <span class="cm-variable-2">$i</span><span class="cm-operator">++</span>) {</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable-2">$chArr</span>[<span class="cm-variable-2">$i</span>] <span class="cm-operator">=</span> <span class="cm-builtin">curl_init</span>();</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-builtin">curl_setopt_array</span>(<span class="cm-variable-2">$chArr</span>[<span class="cm-variable-2">$i</span>], <span class="cm-variable-2">$optArr</span>);</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable-2">$result</span>[<span class="cm-variable-2">$i</span>] <span class="cm-operator">=</span> <span class="cm-builtin">curl_exec</span>(<span class="cm-variable-2">$chArr</span>[<span class="cm-variable-2">$i</span>]);</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-builtin">curl_close</span>(<span class="cm-variable-2">$chArr</span>[<span class="cm-variable-2">$i</span>]);</span><br /><span role="presentation">}</span><br /><span role="presentation">​</span><br /><span role="presentation"><span class="cm-variable-2">$endTime</span> <span class="cm-operator">=</span> <span class="cm-builtin">microtime</span>(<span class="cm-atom">true</span>);</span><br /><span role="presentation"><span class="cm-keyword">echo</span> <span class="cm-builtin">sprintf</span>(<span class="cm-string">"use time: %.3f s"</span>.<span class="cm-variable">PHP_EOL</span>, <span class="cm-variable-2">$endTime</span> <span class="cm-operator">-</span> <span class="cm-variable-2">$startTime</span>);</span><br /><span role="presentation"><span class="cm-keyword">use</span> <span class="cm-builtin">time</span>: <span class="cm-number">6.080</span> <span class="cm-variable">s</span></span></pre> <h3 cid="n46" mdtype="heading" class="md-end-block md-heading"><span class="md-plain">curl_multi并发请求</span></h3> <pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="php" spellcheck="false"><span role="presentation"><span class="cm-variable-2">$startTime</span> <span class="cm-operator">=</span> <span class="cm-builtin">microtime</span>(<span class="cm-atom">true</span>);</span><br /><span role="presentation"><span class="cm-variable-2">$chArr</span> <span class="cm-operator">=</span> [];</span><br /><span role="presentation"><span class="cm-variable-2">$optArr</span> <span class="cm-operator">=</span> [</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable">CURLOPT_URL</span> <span class="cm-operator">=&gt;</span> <span class="cm-string">'http://www.httpbin.org/ip'</span>,</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable">CURLOPT_HEADER</span> <span class="cm-operator">=&gt;</span> <span class="cm-number">0</span>,</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable">CURLOPT_RETURNTRANSFER</span> <span class="cm-operator">=&gt;</span> <span class="cm-number">1</span>,</span><br /><span role="presentation">];</span><br /><span role="presentation"><span class="cm-variable-2">$result</span> <span class="cm-operator">=</span> [];</span><br /><span role="presentation">​</span><br /><span role="presentation"><span class="cm-comment">//创建多个curl资源</span></span><br /><span role="presentation"><span class="cm-keyword">for</span> (<span class="cm-variable-2">$i</span><span class="cm-operator">=</span><span class="cm-number">0</span>; <span class="cm-variable-2">$i</span><span class="cm-operator">&lt;</span><span class="cm-number">10</span>; <span class="cm-variable-2">$i</span><span class="cm-operator">++</span>) {</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable-2">$chArr</span>[<span class="cm-variable-2">$i</span>] <span class="cm-operator">=</span> <span class="cm-builtin">curl_init</span>();</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-builtin">curl_setopt_array</span>(<span class="cm-variable-2">$chArr</span>[<span class="cm-variable-2">$i</span>], <span class="cm-variable-2">$optArr</span>);</span><br /><span role="presentation">}</span><br /><span role="presentation"><span class="cm-comment">//创建批处理curl句柄</span></span><br /><span role="presentation"><span class="cm-variable-2">$mh</span> <span class="cm-operator">=</span> <span class="cm-builtin">curl_multi_init</span>();</span><br /><span role="presentation"><span class="cm-comment">//将单个curl句柄添加到批处理curl句柄中</span></span><br /><span role="presentation"><span class="cm-keyword">foreach</span> (<span class="cm-variable-2">$chArr</span> <span class="cm-keyword">as</span> <span class="cm-variable-2">$ch</span>) {</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-builtin">curl_multi_add_handle</span>(<span class="cm-variable-2">$mh</span>, <span class="cm-variable-2">$ch</span>);</span><br /><span role="presentation">}</span><br /><span role="presentation"><span class="cm-comment">//判断操作是否仍在执行的标识的引用</span></span><br /><span role="presentation"><span class="cm-variable-2">$active</span> <span class="cm-operator">=</span> <span class="cm-atom">null</span>;</span><br /><span role="presentation"><span class="cm-comment">/**</span></span><br /><span role="presentation">​</span><br /><span role="presentation"> <span class="cm-comment">* 本次循环第一次处理 $mh 批处理中的 $ch 句柄,并将 $mh 批处理的执行状态写入 $active,</span></span><br /><span role="presentation"> <span class="cm-comment">* 当状态值等于 CURLM_CALL_MULTI_PERFORM 时,表明数据还在写入或读取中,执行循环,</span></span><br /><span role="presentation"> <span class="cm-comment">* 当第一次 $ch 句柄的数据写入或读取成功后,状态值变为 CURLM_OK ,跳出本次循环,进入下面的大循环中。</span></span><br /><span role="presentation"> &nbsp; <span class="cm-comment">*/</span></span><br /><span role="presentation"> &nbsp; <span class="cm-keyword">do</span> {</span><br /><span role="presentation"> &nbsp; <span class="cm-comment">//处理在批处理栈中的每一个句柄</span></span><br /><span role="presentation"> &nbsp; <span class="cm-variable-2">$mrc</span> <span class="cm-operator">=</span> <span class="cm-builtin">curl_multi_exec</span>(<span class="cm-variable-2">$mh</span>, <span class="cm-variable-2">$active</span>);</span><br /><span role="presentation"> &nbsp; } <span class="cm-keyword">while</span> (<span class="cm-variable-2">$mrc</span> <span class="cm-operator">==</span> <span class="cm-variable">CURLM_CALL_MULTI_PERFORM</span>);</span><br /><span role="presentation"> &nbsp; <span class="cm-comment">/**</span></span><br /><span role="presentation"> <span class="cm-comment">* 上面这段代码中,是可以直接使用 $active &gt; 0 来作为 while 的条件,如下:</span></span><br /><span role="presentation"> <span class="cm-comment">* do {</span></span><br /><span role="presentation"> <span class="cm-comment">* $mrc = curl_multi_exec($mh, $active);</span></span><br /><span role="presentation"> <span class="cm-comment">* } while ($active &gt; 0);</span></span><br /><span role="presentation"> <span class="cm-comment">* 此时如果整个批处理句柄没有全部执行完毕时,系统会不停的执行 curl_multi_exec 函数,从而导致系统CPU占用会很高,</span></span><br /><span role="presentation"> <span class="cm-comment">* 因此一般不采用这种方案,可以通过 curl_multi_select 函数来达到没有需要读取的程序就阻塞住的目的。</span></span><br /><span role="presentation"> &nbsp; <span class="cm-comment">*/</span></span><br /><span role="presentation">​</span><br /><span role="presentation"><span class="cm-comment">/**</span></span><br /><span role="presentation">​</span><br /><span role="presentation"> <span class="cm-comment">* $active 为 true 时,即 $mh 批处理之中还有 $ch 句柄等待处理,</span></span><br /><span role="presentation"> <span class="cm-comment">* $mrc == CURLM_OK,即上一次 $ch 句柄的读取或写入已经执行完毕。</span></span><br /><span role="presentation"> &nbsp; <span class="cm-comment">*/</span></span><br /><span role="presentation"> &nbsp; <span class="cm-keyword">while</span> (<span class="cm-variable-2">$active</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable-2">$mrc</span> <span class="cm-operator">==</span> <span class="cm-variable">CURLM_OK</span>) {</span><br /><span role="presentation"> &nbsp; <span class="cm-comment">/** </span></span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-comment">* 程序进入阻塞状态,直到批处理中有活动连接(即 $mh 批处理中还有可执行的 $ch 句柄),</span></span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-comment">* 这样执行的好处是 $mh 批处理中的 $ch 句柄会在读取或写入数据结束后($mrc == CURLM_OK)进入阻塞阶段,</span></span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-comment">* 而不会在整个 $mh 批处理执行时不停地执行 curl_multi_exec 函数,白白浪费CPU资源。</span></span><br /><span role="presentation"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">*/</span></span><br /><span role="presentation"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-builtin">curl_multi_select</span>(<span class="cm-variable-2">$mh</span>) <span class="cm-operator">!=</span> <span class="cm-operator">-</span><span class="cm-number">1</span>) {</span><br /><span role="presentation"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">//程序退出阻塞状态继续执行需要处理的 $ch 句柄</span></span><br /><span role="presentation"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">do</span> {</span><br /><span role="presentation"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$mrc</span> <span class="cm-operator">=</span> <span class="cm-builtin">curl_multi_exec</span>(<span class="cm-variable-2">$mh</span>, <span class="cm-variable-2">$active</span>);</span><br /><span role="presentation"> &nbsp; &nbsp; } <span class="cm-keyword">while</span> (<span class="cm-variable-2">$mrc</span> <span class="cm-operator">==</span> <span class="cm-variable">CURLM_CALL_MULTI_PERFORM</span>);</span><br /><span role="presentation"> &nbsp; &nbsp; }</span><br /><span role="presentation"> &nbsp; &nbsp; }</span><br /><span role="presentation">​</span><br /><span role="presentation"><span class="cm-keyword">foreach</span> (<span class="cm-variable-2">$chArr</span> <span class="cm-keyword">as</span> <span class="cm-variable-2">$i</span><span class="cm-operator">=&gt;</span><span class="cm-variable-2">$ch</span>) {</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-comment">//获取某个curl句柄的返回值</span></span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-variable-2">$result</span>[<span class="cm-variable-2">$i</span>] <span class="cm-operator">=</span> <span class="cm-builtin">curl_multi_getcontent</span>(<span class="cm-variable-2">$ch</span>);</span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-comment">//移除批处理句柄中的某个句柄资源</span></span><br /><span role="presentation"> &nbsp; &nbsp;<span class="cm-builtin">curl_multi_remove_handle</span>(<span class="cm-variable-2">$mh</span>, <span class="cm-variable-2">$ch</span>);</span><br /><span role="presentation">}</span><br /><span role="presentation"><span class="cm-comment">//关闭一组curl句柄</span></span><br /><span role="presentation"><span class="cm-builtin">curl_multi_close</span>(<span class="cm-variable-2">$mh</span>);</span><br /><span role="presentation"><span class="cm-variable-2">$endTime</span> <span class="cm-operator">=</span> <span class="cm-builtin">microtime</span>(<span class="cm-atom">true</span>);</span><br /><span role="presentation"><span class="cm-keyword">echo</span> <span class="cm-builtin">sprintf</span>(<span class="cm-string">"use time: %.3f s"</span>.<span class="cm-variable">PHP_EOL</span>, <span class="cm-variable-2">$endTime</span> <span class="cm-operator">-</span> <span class="cm-variable-2">$startTime</span>);<br /><br /><br /></span><span role="presentation"><br /></span></pre> <pre class="language-php"><code>后端服务开发中经常会有并发请求的需求,比如你需要获取10家供应商的带宽数据(每个都提供不同的`url`),然后返回一个整合后的数据,你会怎么做呢? 在`PHP`中,最直观的做法`foreach`遍历`urls`,并保存每个请求的结果即可,那么如果供应商提供的接口平均耗时`5s`,你的这个接口请求耗时就达到了`50s`,这对于追求速度和性能的网站来说是不可接受的。 这个时候你就需要并发请求了。 ## `PHP`请求 `PHP`是单进程同步模型,一个请求对应一个进程,`I/O`是同步阻塞的。通过`nginx/apache/php-fpm`等服务的扩展,才使得PHP提供高并发的服务,原理就是维护一个进程池,每个请求服务时单独起一个新的进程,每个进程独立存在。 `PHP`不支持多线程模式和回调处理,因此`PHP`内部脚本都是同步阻塞式的,如果你发起一个`5s`的请求,那么程序就会`I/O`阻塞`5s`,直到请求返回结果,才会继续执行代码。因此做爬虫之类的高并发请求需求很吃力。 那怎么来解决并发请求的问题呢?除了内置的`file_get_contents`和`fsockopen`请求方式,`PHP`也支持`cURL`扩展来发起请求,它支持常规的单个请求:[PHP cURL请求详解](https://segmentfault.com/a/1190000014922772#articleHeader3),也支持并发请求,其并发原理是`cURL`扩展使用多线程来管理多请求。 ## `PHP`并发请求 我们直接来看代码`demo`: ```php // 简单demo,默认支持为GET请求 public function multiRequest($urls) { $mh = curl_multi_init(); $urlHandlers = []; $urlData = []; // 初始化多个请求句柄为一个 foreach($urls as $value) { $ch = curl_init(); $url = $value['url']; $url .= strpos($url, '?') ? '&amp;' : '?'; $params = $value['params']; $url .= is_array($params) ? http_build_query($params) : $params; curl_setopt($ch, CURLOPT_URL, $url); // 设置数据通过字符串返回,而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $urlHandlers[] = $ch; curl_multi_add_handle($mh, $ch); } $active = null; // 检测操作的初始状态是否OK,CURLM_CALL_MULTI_PERFORM为常量值-1 do { // 返回的$active是活跃连接的数量,$mrc是返回值,正常为0,异常为-1 $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 如果还有活动的请求,同时操作状态OK,CURLM_OK为常量值0 while ($active &amp;&amp; $mrc == CURLM_OK) { // 持续查询状态并不利于处理任务,每50ms检查一次,此时释放CPU,降低机器负载 usleep(50000); // 如果批处理句柄OK,重复检查操作状态直至OK。select返回值异常时为-1,正常为1(因为只有1个批处理句柄) if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 获取返回结果 foreach($urlHandlers as $index =&gt; $ch) { $urlData[$index] = curl_multi_getcontent($ch); // 移除单个curl句柄 curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh); return $urlData; } ``` 在该并发请求中,先创建一个批处理句柄,然后将`url`的`cURL`句柄添加到批处理句柄中,并不断查询批处理句柄的执行状态,当执行完成后,获取返回的结果。 ## `curl_multi` 相关函数 ```php /** 函数作用:返回一个新cURL批处理句柄 @return resource 成功返回cURL批处理句柄,失败返回false */ resource curl_multi_init ( void ) /** 函数作用:向curl批处理会话中添加单独的curl句柄 @param $mh 由curl_multi_init返回的批处理句柄 @param $ch 由curl_init返回的cURL句柄 @return resource 成功返回cURL批处理句柄,失败返回false */ int curl_multi_add_handle ( resource $mh , resource $ch ) /** 函数作用:运行当前 cURL 句柄的子连接 @param $mh 由curl_multi_init返回的批处理句柄 @param $still_running 一个用来判断操作是否仍在执行的标识的引用 @return 一个定义于 cURL 预定义常量中的 cURL 代码 */ int curl_multi_exec ( resource $mh , int &amp;$still_running ) /** 函数作用:等待所有cURL批处理中的活动连接 @param $mh 由curl_multi_init返回的批处理句柄 @param $timeout 以秒为单位,等待响应的时间 @return 成功时返回描述符集合中描述符的数量。失败时,select失败时返回-1,否则返回超时(从底层的select系统调用). */ int curl_multi_select ( resource $mh [, float $timeout = 1.0 ] ) /** 函数作用:移除cURL批处理句柄资源中的某个句柄资源 说明:从给定的批处理句柄mh中移除ch句柄。当ch句柄被移除以后,仍然可以合法地用curl_exec()执行这个句柄。如果要移除的句柄正在被使用,则这个句柄涉及的所有传输任务会被中止。 @param $mh 由curl_multi_init返回的批处理句柄 @param $ch 由curl_init返回的cURL句柄 @return 成功时返回0,失败时返回CURLM_XXX中的一个 */ int curl_multi_remove_handle ( resource $mh , resource $ch ) /** 函数作用:关闭一组cURL句柄 @param $mh 由curl_multi_init返回的批处理句柄 @return void */ void curl_multi_close ( resource $mh ) /** 函数作用:如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流 @param $ch 由curl_init返回的cURL句柄 @return string 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。 */ string curl_multi_getcontent ( resource $ch ) ``` &gt; 本例中使用到的[预定义常量](http://php.net/manual/zh/curl.constants.php): &gt; `CURLM_CALL_MULTI_PERFORM: (int) -1` &gt; `CURLM_OK: (int) 0` ## `PHP`并发请求耗时对比 1. 第一次请求使用上面的`curl_multi_init`方法,并发请求`105`次。 2. 第二次请求使用传统的`foreach`方法,遍历`105`次使用`curl_init`方法请求。 实际的请求耗时结果为: ![img](https://img2018.cnblogs.com/blog/1504257/201811/1504257-20181116203953439-1082205242.png) 刨除`download`的约`765ms`耗时,单纯的请求耗时优化达到了`39.83/1.58`达到了`25`倍,如果继续刨除建连相关的耗时,应该会更高。这其中的耗时: - 方案1:最慢的一个接口达到了`1.58s` - 方案2:`105`个接口的平均耗时是`384ms` &gt; 这个测试的请求是我的环境的内部接口,所以耗时很短,实际爬虫请求环境优化会更明显。 ## 注意项 ### 并发数限制 `curl_multi`会消耗很多的系统资源,在并发请求时并发数有一定阈值,一般为`512`,是由于`CURL`内部限制,超过最大并发会导致失败。 &gt; 具体的测试结果我没有做,可以参考别人的文章:[每次使用curl multi同时并发多少请求合适](https://blog.csdn.net/loophome/article/details/53266814) ### 超时时间 为了防止慢请求影响整个服务,可以设置`CURLOPT_TIMEOUT`来控制超时时间,防止部分假死的请求无限阻塞进程处理,最后打死机器服务。 ### `CPU`负载打满 在代码示例中,如果持续查询并发的执行状态,会导致`cpu`的负载过高,所以,需要在代码里加上`usleep(50000);`的语句。 同时,`curl_multi_select`也可以控制`cpu`占用,在数据有回应前会一直处于等待状态,新数据一来就会被唤醒并继续执行,减少了`CPU`的无谓消耗。 ## 参考资料 1. `PHP手册 curl_multi_init`:[http://php.net/manual/zh/func...](http://php.net/manual/zh/function.curl-multi-init.php) 2. `PHP手册 curl预定义常量`:[http://php.net/manual/zh/curl...](http://php.net/manual/zh/curl.constants.php) 3. `PHP中foreach curl实现多线程`:[http://www.111cn.net/phper/ph...](http://www.111cn.net/phper/php/79106.htm) 4. `Doing curl_multi_exec the right way`:[http://www.adrianworlddesign....](http://www.adrianworlddesign.com/Knowledge-Base/php/Download-content-with-cURL/Doing-curlmultiexec-the-right-way) 5. `Segmentfault PHP cURL请求详解`:[https://segmentfault.com/a/11...](https://segmentfault.com/a/1190000014922772#articleHeader7) 6. `CSDN 每次使用curl multi同时并发多少请求合适`:[https://blog.csdn.net/loophom...](https://blog.csdn.net/loophome/article/details/53266814) 7. `简书 Curl多线程及原理`:[https://www.jianshu.com/p/f50...](https://www.jianshu.com/p/f50a3f6f9217)</code></pre> <pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="php" spellcheck="false"><span role="presentation">&nbsp;<br /></span></pre> <pre class="language-php"><code>这就是我碰到的第一个问题,百度的网页都获取不了了 (1)利用php的curl抓取网站信息,出现中文乱码的情况: $rs = curl_exec($ch); //关闭cURL资源,并且释放系统资源 curl_close($ch); $rs = mb_convert_encoding($rs, 'utf-8', 'GBK,UTF-8,ASCII'); //加上这行 (2)如果抓取的网页进行了gzip压缩,那么获取的内容很有可能是乱码 解决方案:curl_setopt($ch,CURLOPT_ENCODING,'gzip')//加入gzip解析 (3)如果curl请求的网页发生了重定向,那么抓取的结果很可能为空 解决方案:curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//加入重定向处理 二、关于curl_getinfo curl_getinfo的使用。返回来一个数组类型的值,里面有一个url,有一个http_code,http_code可以是302,200,404,500等,如果是302的话, 就是页面跳转,直接可以得到跳转的页面的url。 如果是想取到具体的值,可以采用:curl_getinfo($ch,CURLINFO_HTTP_CODE),则会返回一个http_code字符串。 参数(20个): CURLINFO_EFFECTIVE_URL &ndash; 最后一个有效的URL地址 CURLINFO_HTTP_CODE &ndash; 最后一个收到的HTTP代码 CURLINFO_FILETIME &ndash; 远程获取文档的时间,如果无法获取,则返回值为&ldquo;-1&rdquo; CURLINFO_TOTAL_TIME &ndash; 最后一次传输所消耗的时间 CURLINFO_NAMELOOKUP_TIME &ndash; 名称解析所消耗的时间 CURLINFO_CONNECT_TIME &ndash; 建立连接所消耗的时间 CURLINFO_PRETRANSFER_TIME &ndash; 从建立连接到准备传输所使用的时间 CURLINFO_STARTTRANSFER_TIME &ndash; 从建立连接到传输开始所使用的时间 CURLINFO_REDIRECT_TIME &ndash; 在事务传输开始前重定向所使用的时间 CURLINFO_SIZE_UPLOAD &ndash; 上传数据量的总值 CURLINFO_SIZE_DOWNLOAD &ndash; 下载数据量的总值 CURLINFO_SPEED_DOWNLOAD &ndash; 平均下载速度 CURLINFO_SPEED_UPLOAD &ndash; 平均上传速度 CURLINFO_HEADER_SIZE &ndash; header部分的大小 CURLINFO_HEADER_OUT &ndash; 发送请求的字符串 CURLINFO_REQUEST_SIZE &ndash; 在HTTP请求中有问题的请求的大小 CURLINFO_SSL_VERIFYRESULT &ndash; 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果 CURLINFO_CONTENT_LENGTH_DOWNLOAD &ndash; 从Content-Length: field中读取的下载内容长度 CURLINFO_CONTENT_LENGTH_UPLOAD &ndash; 上传内容大小的说明 CURLINFO_CONTENT_TYPE &ndash; 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type: header 可以根据需要设置不同的参数。</code></pre> <pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="php" spellcheck="false"><span role="presentation">&nbsp;</span></pre>...

mysqli操作数据库(原生SQL语句)

php操作数据库大体分为以下八个步骤(mysqli): 第一步:链接数据库     mysqli_connect('主机地址','mysql用户名','mysql密码 ','数据库','端口号')    返回:如果连接成功,返回资源类型的标志符号;如果连接失败,返回false。    如果我们与mysql建立的连接不只一条,那么以后操作数据库的各种函数都必须传入返回的连接符号;    如果我们与mysql建立的连接只有一条,那么以后操作数据库的各种函数就不必传入这个标识符号。建议都传入。    密码为空可以省略密码    $conn= mysqli_connect("localhost", "root", "123456", "dbname"); 第二步:检测数据库连接是否成功    mysqli_connect_errno()与 mysqli_connect_error()    mysqli_connect_errno(); 返回上次连接数据库错误的错误号,连接成功返回0    mysqli_connect_error(); 返回上次连接数据库的错误信息    if(mysqli_connect_errno($conn)){      die("数据库连接失败!失败信息:".mysqli_connect_error($conn));    }    前面两步合并的写法:连接数据库同时判断    $conn = mysqli_connect("localhost", "root", "", "mydb") or die("数据库连接失败!失败信息:".mysqli_connect_error($conn)); 第三步:选择数据库    mysqli_select_db($link,$dbname)    参数:①标识符 ②连接数据库名称    连接成功,返回true;连接失败,返回false    如果修改数据库成功,则资源标识符中的数据库就会发生变动;    如果修改失败而没有通过代码终止操作,则后续代码可以使用原数据库继续执行    mysqli_select_db($conn, "mydb") or die("数据库选择失败!"); 第四步:设置字符集编码格式    mysqli_set_charset($link,$charset) 只能设置为utf8而不能是utf-8    mysqli_set_charset($conn,"utf8") or die("数据库编码集设置失败!"); 第五步:编写sql语句    $sql = "select * from 表名"; 第六步:执行sql语句    mysqli_query($link,$sql)    如果是(DML)增、删、改,将返回布尔类型是否成功    返回上一次操作时受影响的行数 mysqli_affected_rows($link)    如果是(DQL)查询,将返回资源结果集    返回资源结果集中的行数 mysql_num_rows($result)    返回资源结果集中的字段数 mysql_num_fields($result)    如果查询失败,返回false    $res = mysqli_query($conn,$sql);    mysqli_insert_id($conn); 执行插入语句是返回上次插入最新插入的主键ID 第七步:解析结果集    var_dump(mysqli_fetch_array($res)); 处理结果集,返回关联数组和索引数组 不常用    参数① 需要处理的结果集    参数② 返回哪种数组格式    MYSQL_ASSOC - 关联数组    MYSQL_NUM - 数字数组    MYSQL_BOTH - 默认。同时产生关联和数字数组    echo "<table border='1' style='border-collapse:collapse;text-align:center;width:200px;'>";        echo "<thead bgcolor='lightblue' style='color:#ffffff;'><td>ID</td><td>姓名</td><td>年龄</td><td>性别</td></thead>";        while($row =mysqli_fetch_assoc($res)){               // 返回关联数组 指针遍历 常用        echo "<tr>";            foreach($row as $value){            echo "<td>{$value}</td>";            };            echo "</tr>";        }        echo "</table>";    mysqli_data_seek($res,0); 设置结果集指针位置,此式表达复位至0    var_dump(mysqli_fetch_object($res));    var_dump(mysqli_fetch_row($res)); 返回索引数组    var_dump(mysqli_fetch_object($res)); 返回对象    var_dump(mysqli_fetch_fields($res)); 返回结果集中每一列的字段信息 第八步:关闭资源与结果集    mysqli_free_result()和mysqli_close()    mysqli_free_result($res); //释放查询资源结果集    mysqli_close($conn); //关闭数据库连接...

史上最强视频网页客户端

<p style="text-align: center;"><span style="font-size: 24pt;"><strong><span style="color: #ba372a;">史上最强视频网页客户端</span></strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>优点:</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; 1、防止别人抓包网页端解析做成json,从而引起服务器负荷,从而严禁偷解析的人。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; 2、可以对app,网站进行授权使用,即使别人模仿请求也没啥用处,因为系统带有解析和检查功能</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; 3、系统带有视频解析记录管理,可以对播放器播放的资源进行记录,从而知道是否解析成功,是否可用,当日解析了多少次</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; 4、系统带有用户使用管理:</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1、可以观看使用该客户端的人当日播放了多少次,解析了多少次,解析最后的时间。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2、如果出现大量调用,可以严禁该使用者,这个使用者下次将无法再次使用。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3、而且系统带有每个用户当天最大解析成功次数,</strong></span><span style="font-size: 14pt; color: #000000;"><strong>&nbsp;例如设置150次,当这个用户解析了150次&nbsp; 今日将不在支持解析,</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;即使那边开了代理抓包也一样,从而做到接口不被偷,不被盗用,</strong></span><span style="font-size: 14pt; color: #000000;"><strong>从而成本降低,</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;服务器更加流畅,因为解析被偷会对服务器有很大的影响的哦。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;因为增加了不该是你的用户调用服务器资源的负担,很大概率引起服务器瘫痪。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4、可以对异常用户进行严禁操作,禁止该用户后,该用户将不在支持使用该客户端进行视频播放</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; 5、系统采用<em>RC4加密,</em>带有自定义rac加密密钥功能,即使你的加密被他们临时破译,该一下密钥它那边就又不行了。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;而且rc4加密后能解密出来的&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;人几乎很少很少,能解密的也不会是那些专门做偷解析的人解的出来的。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;再说解出来又如何 改一下密钥和加密条件 ,它那边又得死,有啥用。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;再加上黑名单系统,IP系统,次数限制系统,就算它完全解出来,我拉黑Ip,或者每天给他10次播放。它偷解析 顶多也只能播放10次,拉黑了它的IP。它只能换服务器才能再次使用&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 了,它偷啥?你跟我说,六大安全系&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;数严格把控,它无路可偷,拿什么偷你的资源?你还可以给他返回一个美女视频,给他返回一个百度网页,给他返回一个404死的页面,它&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;无路可偷。所以说这款播放器没人能偷,放心大胆使用,而且后台也记录所有人使用记录,一看便清。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;6、系统带有抓包检查功能,系统你开启抓包某IP时候,它就会生成两个txt文件,可以对你的请求头部,响应体,请求体,请求参数,请求人等待写入一个txt文件,这样你检查功能时候&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;就可以更快找出问题。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;7、系统带有调式禁止功能,它F12 CTRL+U就给他调一个你指定的网站,也提高的你浏览量,提高收录的可能。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;8、系统带有4款播放器。CKPlayer&nbsp; &nbsp;DPlayer&nbsp; AirPlayer&nbsp; MuiPlayer 播放器,后期会对这四款播放,重新对接官方最新功能,以及整合弹幕</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;9、目前就CkPlayer支持弹幕&nbsp; &nbsp; 四款播放器都支持p2p,提前增进播放进度,从而快速播放</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;10、多解析接口目前支持轮询算法,随机算法,权重算法,也就是支持很多接口轮询,随机,权重,完美的解决播放解析问题。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;11、系统支持对播放链接进行加密,严格控制播放链接明文化,你可以选择明文,非明文,但是系统带有严禁盗用功能,明文不明文影响不大,但是加密会更好点。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;12、系统带有链接时效性,就是这个链接你设置30s,超过这个链接 他就回返回你想要的功能,例如404,跳到百度(自定义网页),</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;给出一个视频提示说你链接已失效,请重新获取。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;13、目前播放广告 暂停广告,logo只支持ckplayer播放器。其他播放器不支持。因为懒得整,没啥意义。</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;14、系统带有视频链接检测功能,例如你想对这个视频 http://xingji.xxxx/xxx.m3u8&nbsp; 、http://xingji.xxxx/xxx.mp4等直链先经过你指定的接口进行解析再播放,</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;而不是直接播放,可以再后台设置,只要设置了 是这个链接都会经过接口处理再播放,</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 例如量子,非凡资源,你想要经过你指定的接口进行去广告处理,在播放,就可以在后台设置,这样只要是量子和非凡资源,都会去了广告再播放哦。非常智能和人性化</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;15、支持自动下一集播放,自动下一集全屏和播放</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;客户端测试站点:<a href="http://121.199.51.76:6622/wchulian/index.php">http://121.199.51.76:6622/admin/index.php</a></strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;网站测试站点:<a href="http://121.199.51.76:6633/index.php/vod/play/id/303309/sid/1/nid/1.html">在线播放乡村爱情15 1 - 高清资源 - 乐享影城</a></strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;账号密码:admin 密码找QQ:2180053423 索取</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;授权域名:299(1/个)元</strong></span></p> <p style="text-align: left;"><span style="font-size: 14pt; color: #000000;"><strong>&nbsp; &nbsp;买断源码:2099元</strong></span></p> <p style="text-align: center;"><span style="font-size: 24pt;"><strong><span style="color: #843fa1;">下面是图片展示</span></strong></span></p> <p style="text-align: left;"><img src="/upload/20230307_1000581287412057.png" /></p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;"><img src="/upload/20230307_1001001765472566.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_1001031557888865.png" /></p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;"><img src="/upload/20230307_100121120919928.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_100121695172078.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_10012593699250.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_100527658507299.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_100538549772268.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_100203382023892.png" /></p> <p style="text-align: left;"><img src="/upload/20230307_1001551317863588.png" /></p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;">&nbsp;</p> <p style="text-align: left;">&nbsp;</p>...

正向代理和反向代理

<p><strong>有时候我们会听到正向代理和反向代理,那么这两个是什么概念呢,今天我们一起来了解一下这两个是什么概念</strong></p> <h1 id="正向代理" tid="tid-eb8QHy"><strong>正向代理</strong>:</h1> <p>意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。---&lt;百度百科&gt;</p> <p>小栗子:我通过vpn访问youtube,这其实就是一个正向代理,客户端通过一个代理服务器,然后代理服务器就去向youtube发送请求,然后把请求回来的内容发送给客户端.</p> <p>再举个例子,你去饭店吃饭,这时候来了一个服务员(小王),你需要点什么菜都会跟他说,然后他拿着你的菜单去后厨让厨师来帮你做菜,等厨师把菜做完了,服务员就回去把菜给你端过来,你就可以吃了,在这个过程中,你就是客户端,服务员(小王就是代理服务器),厨师就是服务器,在这之中,你和小王是认识的,但是你和厨师是不认识的,你的所有要求都是通过服务员(小王)去实现的,厨师长也只需要和小王对接就好了,所以这就是一个简单的正向代理的小栗子<br /><a data-fancybox="gallery" href="https://img2020.cnblogs.com/blog/2589936/202110/2589936-20211019172606827-2057365256.png"><img src="/upload/20221117_024350492575494.png" alt="" /></a></p> <h1 id="反向代理" tid="tid-kP5hK6"><strong>反向代理:</strong></h1> <p>反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率-&lt;百度百科&gt;</p> <p>上面说起来这么绕,简单的打个比方,你给10086客户打电话,10086会根据目前内个客户的繁忙程度给你分配一个客服解决问题,在这个过程中,10086分配客户这个事情就可以看作是反向代理,你的客服代表是通过10086分配的,分配系统就可以看做一个反向代理服务器,他对外的接口就是10086,但是他背后连接的是整个10086的客服系统.通过下图就可以能明白</p> <p>简单说,</p> <p>我们去访问一个服务器,这个服务器会根据当前各个服务器的繁忙程度会分配一台服务器,然后把你的请求发给他,然后把返回来的结果发送给你,在这个过程中,你并不清楚你访问的具体是那台服务器,因为他们内部已经做了处理.</p> <p>&nbsp;</p> <p><a data-fancybox="gallery" href="https://img2020.cnblogs.com/blog/2589936/202110/2589936-20211019172606809-2039124144.png"><img src="/upload/20221117_024411516283589.png" alt="" /></a></p> <p>接下来我提炼一下各自的特点:</p> <p>正向代理:</p> <ul> <li>代理客户。</li> <li>隐藏真实的客户,为客户端收发请求,使真实客户端对服务器不可见。</li> <li>一个局域网内的所有用户可能被一台服务器做了正向代理,由该台服务器负责 HTTP 请求。</li> <li>意味着同服务器做通信的是正向代理服务器。</li> </ul> <p>反向代理:</p> <ul> <li>代理服务器。</li> <li>隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。</li> <li>负载均衡服务器,将用户的请求分发到空闲的服务器上。</li> <li>意味着用户和负载均衡服务器直接通信,即用户解析服务器域名时得到的是负载均衡服务器的 IP。</li> </ul> <p>共同点:</p> <ul> <li>都是做为服务器和客户端的中间层。</li> <li>都可以加强内网的安全性,阻止 Web 攻击。</li> <li>都可以做缓存机制,提高访问速度。</li> </ul> <p>区别:</p> <ul> <li>正向代理其实是客户端的代理,反向代理则是服务器的代理。</li> <li>正向代理中,服务器并不知道真正的客户端到底是谁;而在反向代理中,客户端也不知道真正的服务器是谁。</li> <li>作用不同。正向代理主要是用来解决访问限制问题;而反向代理则是提供负载均衡、安全防护等作用。</li> </ul> <p>最后出个题</p> <p>比如爸爸和小孩说,你去你妈妈那里要500块钱说老师要收补课费,然后把500给我,我让你今天看电视。</p> <p>请问宝宝在这里充当的是&ldquo;正向代理&rdquo;还是&ldquo;反向代理&rdquo;(当然宝宝长大后我肯定不会这样)?</p> <p>以上只是说了一个概念而已,理解即可</p> <p>&nbsp;</p> <p>&nbsp;</p> <h3>2、正向代理</h3> <p>  弄清楚什么是代理了,那么什么又是正向代理呢?</p> <p>  这里我再举一个例子:大家都知道,现在国内是访问不了 Google的,那么怎么才能访问 Google呢?我们又想,美国人不是能访问 Google吗(这不废话,Google就是美国的),如果我们电脑的对外公网 IP 地址能变成美国的 IP 地址,那不就可以访问 Google了。你很聪明,VPN 就是这样产生的。我们在访问 Google 时,先连上 VPN 服务器将我们的 IP 地址变成美国的 IP 地址,然后就可以顺利的访问了。</p> <p>  这里的 VPN 就是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。</p> <p>  PS:这里介绍一下什么是 VPN,VPN 通俗的讲就是一种中转服务,当我们电脑接入 VPN 后,我们对外 IP 地址就会变成 VPN 服务器的 公网 IP,我们请求或接受任何数据都会通过这个VPN 服务器然后传入到我们本机。这样做有什么好处呢?比如 VPN 游戏加速方面的原理,我们要玩网通区的 LOL,但是本机接入的是电信的宽带,玩网通区的会比较卡,这时候就利用 VPN 将电信网络变为网通网络,然后在玩网通区的LOL就不会卡了(注意:VPN 是不能增加带宽的,不要以为不卡了是因为网速提升了)。</p> <p>  可能听到这里大家还是很抽象,没关系,和下面的反向代理对比理解就简单了。</p> <h3>3、反向代理<button class="cnblogs-toc-button" title="显示目录导航" aria-expanded="false"></button></h3> <p>  反向代理和正向代理的区别就是:<strong>正向代理代理客户端,反向代理代理服务器。</strong></p> <p><strong>  </strong>反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。</p> <p>&nbsp;</p> <p>理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。</p> <p>  总结起来还是一句话:<strong>正向代理代理客户端,反向代理代理服务器。</strong></p>...

利用蚂蚁市场从手机推送app到电视安装

<p style="text-align: center;">&nbsp;</p> <p style="text-align: center;"><span style="color: #e03e2d; font-size: 24pt;">当贝助手、当贝桌面、蚂蚁市场、当贝市场,办法都一样,其他的自己百度,只有看到那个网址就行了</span></p> <p style="text-align: center;"><img src="/upload/20221105_051021168790173.jpg" /></p> <p style="text-align: center;"><img src="/upload/20221105_0510301171998095.png" /></p> <p style="text-align: center;"><img src="/upload/20221105_0510361332968348.png" /></p> <p style="text-align: center;">&nbsp;</p> <p style="text-align: center;">&nbsp;</p> <p style="text-align: center;">1、当贝助手应用打开后找到&ldquo;文件快传&rdquo;并点击</p> <p style="text-align: center;"><img src="/upload/20221025_0346281770311964.jpg" alt="" /></p> <p style="text-align: center;">2、点击后可以看到&ldquo;将手机/电脑连接至盒子所在局域网打开浏览器,访问以下网址,即可安装应用&rdquo;的教程提示,因此我们可以在手机或者电脑上提前保存好要传到电视中的应用</p> <p style="text-align: center;">(必须手机/电脑跟电视的wifi必须一样哦--》输入http://192.168.1.101:4343)</p> <p style="text-align: center;">&nbsp;</p> <p style="text-align: center;"><img src="/upload/20221025_0350346048838.png" alt="" width="1000" height="499" /></p> <p style="text-align: center;">3、然后手机或者电脑打开显示的地址输入在手机或者电脑浏览器中(一定要连接同一WiFi才能使用)然后会跳转出此界面,</p> <p style="text-align: center;">在此界面中点击上传APK,将提前下载好的安装包(APK格式)上传</p> <p style="text-align: center;">&nbsp;</p> <p style="text-align: center;"><img src="/upload/20221025_035204271033558.png" alt="" width="1000" height="565" /></p> <p style="text-align: center;">上传后就会在电视中显示了,点击&ldquo;打开&rdquo;会自动下载安装然后就可以使用啦,以上就是怎么将手机文件传到电视的操作方法了</p> <p style="text-align: center;"><img src="/upload/20221025_035415622552631.png" alt="" width="1000" height="630" /></p> <p style="text-align: center;">最后电视就会显示这个--点击打开电视就可以安装了哦</p> <p style="text-align: center;"><img src="/upload/20221025_035436287947836.png" alt="" width="1000" height="499" /></p> <p style="text-align: center;">这种办法目前:当贝助手、当贝市场、当贝桌面都有哦</p>...

个人信息

梦幻书涯
星际导航

热门文章

1
2
3
4
推荐专区