开发过程中,我们经常会用到各种各样的包管理工具,几乎每种包管理工具缺省设置都是从国外服务器下载相应的软件安装包,或者下载很慢,或者干脆无法下载。以下列出我常用的所有国内镜像,方便有类似需求的同学参考 (不定期更新,感觉有用的同学请注意收藏) 。 我平常用的 shell 是 fish ,所以下面的语法全都是 fish 相关的 set \-x ,如果是用缺省的 bash ,可以替换成 export 命令。 操作系统相关 brew国内镜像 cd /usr/local/Homebrew git remote set-url origin https://mirrors.ustc.edu.cn/brew.git cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git\# brew国内镜像 set -x HOMEBREW\_BOTTLE\_DOMAIN https://mirrors.ustc.edu.cn/homebrew-bottles Javascript相关 npm国内镜像 npm config set registry https://registry.npm.taobao.org/ yarn国内镜像 yarn config set registry https://registry.npm.taobao.org/ pnpm国内镜像 pnpm config set registry https://registry.npm.taobao.org/ electron国内镜像 set -x ELECTRON\_MIRROR http://npm.taobao.org/mirrors/electron/ node-sass国内镜像 set -x SASS\_BINARY\_SITE https://npm.taobao.org/mirrors/node-sass/ fsevents国内镜像 set -x FSE\_BINARY\_HOST\_MIRROR https://npm.taobao.org/mirrors/fsevents/ 更多 更多设置,或者懒得一个一个设置的同学也可以参考这里: https://gist.github.com/hetyk... 把这些代码下载到一个shell脚本里,一键添加完成。 Python相关 pip国内镜像 \$ cat \~/.pip/pip.conf \[global\] index\-url=https://pypi.tuna.tsinghua.edu.cn/simple conda国内镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --set show\_channel\_urls yes 其它语言 flutter国内镜像 set -x PUB\_HOSTED\_URL https://pub.flutter-io.cn set -x FLUTTER\_STORAGE\_BASE\_URL https://storage.flutter-io.cn ...
<pre class="language-php"><code><?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 && $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); ?></code></pre> <pre class="language-php"><code></code></pre>...
这篇文章主要介绍了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。用来获取需要登录的页面的例子,当前做法是每次或许都登录一次,有需要的人再做改进了....
<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 /> usleep(10000);<br /> curl_multi_exec($mh,$running);<br />} while ($running > 0);<br />// 关闭全部句柄<br />curl_multi_remove_handle($mh, $ch1);<br />curl_multi_remove_handle($mh, $ch2);<br />curl_multi_close($mh);<br />?></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"> <span class="cm-variable">CURLOPT_URL</span> <span class="cm-operator">=></span> <span class="cm-string">'http://www.httpbin.org/ip'</span>,</span><br /><span role="presentation"> <span class="cm-variable">CURLOPT_HEADER</span> <span class="cm-operator">=></span> <span class="cm-number">0</span>,</span><br /><span role="presentation"> <span class="cm-variable">CURLOPT_RETURNTRANSFER</span> <span class="cm-operator">=></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"><</span><span class="cm-number">10</span>; <span class="cm-variable-2">$i</span><span class="cm-operator">++</span>) {</span><br /><span role="presentation"> <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"> <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 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"> <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"> <span class="cm-variable">CURLOPT_URL</span> <span class="cm-operator">=></span> <span class="cm-string">'http://www.httpbin.org/ip'</span>,</span><br /><span role="presentation"> <span class="cm-variable">CURLOPT_HEADER</span> <span class="cm-operator">=></span> <span class="cm-number">0</span>,</span><br /><span role="presentation"> <span class="cm-variable">CURLOPT_RETURNTRANSFER</span> <span class="cm-operator">=></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"><</span><span class="cm-number">10</span>; <span class="cm-variable-2">$i</span><span class="cm-operator">++</span>) {</span><br /><span role="presentation"> <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"> <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"> <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"> <span class="cm-comment">*/</span></span><br /><span role="presentation"> <span class="cm-keyword">do</span> {</span><br /><span role="presentation"> <span class="cm-comment">//处理在批处理栈中的每一个句柄</span></span><br /><span role="presentation"> <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"> } <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"> <span class="cm-comment">/**</span></span><br /><span role="presentation"> <span class="cm-comment">* 上面这段代码中,是可以直接使用 $active > 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 > 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"> <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"> <span class="cm-comment">*/</span></span><br /><span role="presentation"> <span class="cm-keyword">while</span> (<span class="cm-variable-2">$active</span> <span class="cm-operator">&&</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"> <span class="cm-comment">/** </span></span><br /><span role="presentation"> <span class="cm-comment">* 程序进入阻塞状态,直到批处理中有活动连接(即 $mh 批处理中还有可执行的 $ch 句柄),</span></span><br /><span role="presentation"> <span class="cm-comment">* 这样执行的好处是 $mh 批处理中的 $ch 句柄会在读取或写入数据结束后($mrc == CURLM_OK)进入阻塞阶段,</span></span><br /><span role="presentation"> <span class="cm-comment">* 而不会在整个 $mh 批处理执行时不停地执行 curl_multi_exec 函数,白白浪费CPU资源。</span></span><br /><span role="presentation"> <span class="cm-comment">*/</span></span><br /><span role="presentation"> <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"> <span class="cm-comment">//程序退出阻塞状态继续执行需要处理的 $ch 句柄</span></span><br /><span role="presentation"> <span class="cm-keyword">do</span> {</span><br /><span role="presentation"> <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"> } <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"> }</span><br /><span role="presentation"> }</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">=></span><span class="cm-variable-2">$ch</span>) {</span><br /><span role="presentation"> <span class="cm-comment">//获取某个curl句柄的返回值</span></span><br /><span role="presentation"> <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"> <span class="cm-comment">//移除批处理句柄中的某个句柄资源</span></span><br /><span role="presentation"> <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, '?') ? '&' : '?'; $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 && $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 => $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 &$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 ) ``` > 本例中使用到的[预定义常量](http://php.net/manual/zh/curl.constants.php): > `CURLM_CALL_MULTI_PERFORM: (int) -1` > `CURLM_OK: (int) 0` ## `PHP`并发请求耗时对比 1. 第一次请求使用上面的`curl_multi_init`方法,并发请求`105`次。 2. 第二次请求使用传统的`foreach`方法,遍历`105`次使用`curl_init`方法请求。 实际的请求耗时结果为:  刨除`download`的约`765ms`耗时,单纯的请求耗时优化达到了`39.83/1.58`达到了`25`倍,如果继续刨除建连相关的耗时,应该会更高。这其中的耗时: - 方案1:最慢的一个接口达到了`1.58s` - 方案2:`105`个接口的平均耗时是`384ms` > 这个测试的请求是我的环境的内部接口,所以耗时很短,实际爬虫请求环境优化会更明显。 ## 注意项 ### 并发数限制 `curl_multi`会消耗很多的系统资源,在并发请求时并发数有一定阈值,一般为`512`,是由于`CURL`内部限制,超过最大并发会导致失败。 > 具体的测试结果我没有做,可以参考别人的文章:[每次使用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"> <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 – 最后一个有效的URL地址 CURLINFO_HTTP_CODE – 最后一个收到的HTTP代码 CURLINFO_FILETIME – 远程获取文档的时间,如果无法获取,则返回值为“-1” CURLINFO_TOTAL_TIME – 最后一次传输所消耗的时间 CURLINFO_NAMELOOKUP_TIME – 名称解析所消耗的时间 CURLINFO_CONNECT_TIME – 建立连接所消耗的时间 CURLINFO_PRETRANSFER_TIME – 从建立连接到准备传输所使用的时间 CURLINFO_STARTTRANSFER_TIME – 从建立连接到传输开始所使用的时间 CURLINFO_REDIRECT_TIME – 在事务传输开始前重定向所使用的时间 CURLINFO_SIZE_UPLOAD – 上传数据量的总值 CURLINFO_SIZE_DOWNLOAD – 下载数据量的总值 CURLINFO_SPEED_DOWNLOAD – 平均下载速度 CURLINFO_SPEED_UPLOAD – 平均上传速度 CURLINFO_HEADER_SIZE – header部分的大小 CURLINFO_HEADER_OUT – 发送请求的字符串 CURLINFO_REQUEST_SIZE – 在HTTP请求中有问题的请求的大小 CURLINFO_SSL_VERIFYRESULT – 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果 CURLINFO_CONTENT_LENGTH_DOWNLOAD – 从Content-Length: field中读取的下载内容长度 CURLINFO_CONTENT_LENGTH_UPLOAD – 上传内容大小的说明 CURLINFO_CONTENT_TYPE – 下载内容的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"> </span></pre>...
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;"> </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;"> </p> <p style="text-align: center;"> </p> <p style="text-align: center;">1、当贝助手应用打开后找到“文件快传”并点击</p> <p style="text-align: center;"><img src="/upload/20221025_0346281770311964.jpg" alt="" /></p> <p style="text-align: center;">2、点击后可以看到“将手机/电脑连接至盒子所在局域网打开浏览器,访问以下网址,即可安装应用”的教程提示,因此我们可以在手机或者电脑上提前保存好要传到电视中的应用</p> <p style="text-align: center;">(必须手机/电脑跟电视的wifi必须一样哦--》输入http://192.168.1.101:4343)</p> <p style="text-align: center;"> </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;"> </p> <p style="text-align: center;"><img src="/upload/20221025_035204271033558.png" alt="" width="1000" height="565" /></p> <p style="text-align: center;">上传后就会在电视中显示了,点击“打开”会自动下载安装然后就可以使用啦,以上就是怎么将手机文件传到电视的操作方法了</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>...
阅读3.0让你小说永无忧 书源地址:http://dhw.wchulian.com.cn/fileupload/bookSource.json 下载地址: https://wwc.lanzoul.com/iK5cj0bwopgj密码:593o 软件特点 1、自定义书源,自己设置规则,抓取网页数据,规则简单易懂,软件内有规则说明2、书源规则支持搜索及发现,所有找书看书功能全部自定义,找书更方便3、支持高度自定义阅读界面,切换字体、颜色、背景、行距、段距、加粗、简繁转换等4、支持替换净化,去除广告替换内容很方便5、支持本地TXT、EPUB阅读,手动浏览,智能扫描6、支持多种翻页模式,覆盖、仿真、滑动、滚动等 使用说明 1、开源阅读3.0导入书源●打开阅读软件;●我的-点击"书源管理”;●点击右上角选择“网络导入”; 书源链接http://dhw.wchulian.com.cn/fileupload/bookSource.json●点击书源文件导入;●导入后返回书源管理界面即可看到海量书源。...
@梦幻书涯:正在实现到导航网中