CURL_MULTI 工具类

参考:http://techbbs.zol.com.cn/1/9_3371.html

<?php
/**
 * $results = CurlMulti::cmcheck ( array (
 * 		"http://www.maranellowebfashion.com/prodotti/immagini/scarpa_donna_elisabetta_franchi_sa7962052_rosa_212/1.jpg",
 * 		"http://www.maranellowebfashion.com/prodotti/immagini/scarpa_donna_elisabetta_franchi_sa7962052_rosa_212/222.jpg",
 * 		"http://www.maranellowebfashion.com/prodotti/immagini/scarpa_donna_elisabetta_franchi_sa7962052_rosa_212/3.jpg" 
 * 	) );
 * $results = CurlMulti::cmfetch($results);
 * @author caihaibin
 */
class CurlMulti {
	static $urls = null;
	static $able_urls=null;
	static $resourcs = null;
	static $resoponses = null;
	static $nobody = false;
	static $mh = null;
	static function cminit($urls) {
		self::$resourcs = array ();
		self::$resoponses = array ();
		self::$urls = $urls;
		self::$mh = curl_multi_init ();
		foreach ( $urls as $url ) {
			$ch = curl_init ();
			curl_setopt ( $ch, CURLOPT_URL, $url );
			curl_setopt ( $ch, CURLOPT_HEADER, 0 );
			// 执行不打印
			curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); // return the image
			if (self::$nobody)
				curl_setopt ( $ch, CURLOPT_NOBODY, 1 );
			curl_multi_add_handle ( self::$mh, $ch );
			self::$resourcs [] = $ch;
		}
	}
	static function cmcheck($urls = array()) {
		self::$nobody = true;
		self::$able_urls = array();
		self::cminit ( $urls );
		$active = null;
		// 执行批处理句柄
		do {
			$mrc = curl_multi_exec ( self::$mh, $active );
		} while ( $mrc == CURLM_CALL_MULTI_PERFORM );

		while ( $active && $mrc == CURLM_OK ) {
			if (curl_multi_select ( self::$mh ) != - 1) {
				do {
					$mrc = curl_multi_exec ( self::$mh, $active );
				} while ( $mrc == CURLM_CALL_MULTI_PERFORM );

				if ($mhinfo = curl_multi_info_read ( self::$mh )) {
					// 意味着该连接正常结束
					// 8. 从curl句柄获取信息
					$chinfo = curl_getinfo ( $mhinfo ['handle'] );
					// 9. 死链么?
					if (! $chinfo ['http_code']) {
// 						$chinfo ['url'];
						// 10. 404了?
					} else if ($chinfo ['http_code'] == 404) {
// 						$chinfo ['url'];
						// 11. 还能用
					} else {
						$able_urls[]=$chinfo ['url'];
					}
					// 12. 移除句柄
					curl_multi_remove_handle ( self::$mh, $mhinfo ['handle'] );
					curl_close ( $mhinfo ['handle'] );
					// 13. 加入新URL,干活
					do {
						$mrc = curl_multi_exec ( self::$mh, $active );
					} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
				}
			}
		}
		curl_multi_close ( self::$mh );
		return $able_urls;
	}
	static function cmfetch($urls = array()) {
		self::$nobody = false;
		self::cminit ( $urls );
		$active = null;
		// 执行批处理句柄
		do {
			$mrc = curl_multi_exec ( self::$mh, $active );
		} while ( $mrc == CURLM_CALL_MULTI_PERFORM );

		while ( $active && $mrc == CURLM_OK ) {

			if (curl_multi_select ( self::$mh ) != - 1) {

				do {
					$mrc = curl_multi_exec ( self::$mh, $active );
				} while ( $mrc == CURLM_CALL_MULTI_PERFORM );

			}

		}
		self::cmdestroy ();
		return self::$resoponses;
	}
	static function getContents() {
		return self::$resoponses;
	}
	static function cmdestroy() {
		foreach ( self::$resourcs as &$rs ) {
			self::$resoponses [] = curl_multi_getcontent ( $rs );
			curl_multi_remove_handle ( self::$mh, $rs );
		}
		curl_multi_close ( self::$mh );
	}
}

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

HTML5 跨域提交和上传实现 及 nginx $_SERVER[‘HTTP_X_FILENAME’]解决

以下所涉及的基本都需要有服务器端的权限,没有请绕道~ ,当然也可以当学习哈~

GET

这个普通的jsonp就可以了,其实就是远程调个本地的函数。。谷歌去吧。

POST

发现个有意思的,就是file条件下可以无视跨域,这种做内置浏览器的时候可以好好利用下。

AJAX 这个是本篇最纠结的

普通提交依旧通过jsonp解决

关于表单提交和文件的上传

需要服务器端头的设置

相关原理参考: http://drops.wooyun.org/tips/188

服务器端的设置代码为

if (isset ( $_SERVER ['HTTP_ORIGIN'] )) {
	header ( "Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}" );
	header ( 'Access-Control-Allow-Credentials: true' );
	header ( 'Access-Control-Max-Age: 86400' ); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER ['REQUEST_METHOD'] == 'OPTIONS') {

	if (isset ( $_SERVER ['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] ))
		header ( "Access-Control-Allow-Methods: GET, POST, OPTIONS" );

	if (isset ( $_SERVER ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'] ))
		header ( "Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}" );

	// exit(0);
}

 

XMLHttpRequest Level 2

是否支持跨域的脚本验证

var xhr = new XMLHttpRequest();
	if (typeof xhr.withCredentials == undefined) {
		document.write("fuck");
		//This browser does not support xhr2 yet.
	} else {
		document.write("true");
		//Go head!
	}

简单数据提交

	xhr.open("POST", "http://xxxxxxx", true);
	xhr.onload = function(data) {
		document.write("ok");
		document.write(data);
		//加载完咯...
	}
	//支持跨域发送cookies 改成true 就发不了... 和顺序没有关系
	//xhr.withCredentials = true;
	xhr.send();

 

上传相关文件从这获取,别人写好的,使用的是html5的特性。不过要积分。javaeye那边无需积分

http://blog.csdn.net/never_say_goodbye/article/details/8598521

上传的文件的提取不同于表单的提交,也不能简单通过查看chrome的表单请求头做判断

上传的文件名

$fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);

注:这样获取的文件名在apache下可用。在nginx 里会无法获取。可直接通过判断php://input进行文件传入判断,完善点可以再通过获取文件头判断文件类型

上传的文件数据,单个。。

file_get_contents('php://input')

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

Andriod 手机浏览器测试相关

电脑版的手机模拟器,不要拿那些只修改user-agent的脑残来说事哈!

Opera Mobile Classic Emulator

电脑端的极品,完全模拟,不用每次都切换到手机。。还可以复制粘贴。

http://www.opera.com/zh-cn/developer/mobile-emulator

Chrome mobile  Remote Debugging on Android

不亏是世界级的巨头,每次出的东西都是最最适合开发人员的。完全是从开发人员的角度解决了开发上的麻烦。下载和更新没有别的资源,当然哥也可以将更新好的弄上来哈。不过还是申请个vpn吧,一劳永逸。

https://developers.google.com/chrome-developer-tools/docs/remote-debugging?hl=zh-CN

 

中文参考:http://www.guao.hk/posts/how-to-do-remote-debugging-on-chrome-for-android.html

注:关于phonegap的测试,基本可以通过chrome启动前加参数解决

–disable-web-security 可以实现跨域 ,即ajax 可按原来的方式进行操作,包括文件的上传。

注:最新的版本需要远程调试,需要vpn支持,你懂的

 

手机mobile远程调试工具:

weinre 感觉比较方便,但是具体还得看日后的项目开发检测。主要新东西都有潜在问题。不过相当不错

注:这个东西只是在像phonegap这种特殊情况里,可以用于调试页面和简单的控制台脚本测试。。其它的还是奢望..

http://people.apache.org/~pmuellr/weinre/docs/latest/