标签归档:CURL

PHP中的Promise

简介

前几天看到一篇文章理解 Promise 的工作原理,想起了之前自己写过的一篇文章jQuery.Deferred对象DeferredjQueryPromise的实现。我就在想世界上最好的语言没有对这东西的实现吗?

一查,果然发现2个比较靠谱的库react/promiseguzzlehttp/promises。看了一下文档比较一下之后,觉得react/promise跟靠近Promise的实现。而guzzlehttp/promises库中可以对promise对象进行resolvereject的,这个是有误的,具体参考文章jQuery.Deferred对象,里面有说,哈哈哈哈~~~。

基本用法

创建一个项目文件夹,初始化项目,下载react/promise

1、 回调金字塔

上面代码虽然实现了功能,但是结构复杂。如果用promise来实现就相对简单多了。

react/promise提供了一个promise的变种FulfilledPromise。这个promse默认为fulfilled状态,是操作更简单。

2、 传值

then方法会把上一次return的结果自动传递至下一个方法中。

3、受保护的

为了保证Deferred对象不被误操作,通常在方法内部创建Deferred对象,返回promise对象。那么Deferred对象就可以只受本方法操作,不会受到误操作的影响。

4、 延迟执行

上面方法中当获取到promise的时候,getPromise方法就已经被执行了。
react/promise提供了一种延迟执行的方法。

当获取到promise的时候,方法本体还没有被执行。当调用then的时候才会被去执行。

其实我觉得这并没有什么意义。

高级用法

php由于本身并没有像JavaScript中的Ajax那样的EventLoop事件,上面那些东西都是同步执行,最多只是执行时间的早晚区别。并没有发挥Promse最大的优势。

但是,。。。。。
转折来了~~~
php提供了很多扩展比如libevent扩展、swoole扩展等,这些都可以帮我们实现。

react/event-loop库是对lebevent扩展的封装,我们可以用它来实现一些高级用法。

1、准备

并且php需要安装上libevent扩展。

2、 真正延迟执行

在这个时候,我们可以使用notify方法和外面进行通讯,让外部感知内部执行进度。

高版本CURL 抓取 https/tls1.0时的问题。

高版本CURL抓起HTTPS/TLS1.0是会报错,如下:

Unknown SSL protocol error in connection to query.unionpaysecure.com:443

代码如下:

原因是高版本的CURL不兼容TLS1.0。

解决方法:

设置CURL的SSL的加密算法列表。CURLOPT_SSL_CIPHER_LIST

代码如下

 

参考链接:

http://willbradley.name/2012/10/03/workaround-for-php-error-in-ubuntu-12-04-soapclient-ssl-crypto-enabling-timeout/

http://cn2.php.net/manual/zh/function.curl-setopt.php#Hcom114958