同步执行
PHP 是线程安全的,并且在一个请求的处理过程中是不支持多线程的。 对于网络请求来说,一个请求就是一个进程中的一个线程。
并且,PHP 中的所有代码运行都是同步的,不存在异步执行的代码。
例子
于是我们可以对比 OC 和 Swift 中的多线程,假定在各自语言中抓取一个网页的数据。
在OC中,我们一般使用异步线程操作网络请求
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (data != nil) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
但是,在 PHP 中,除非使用 curl 库,网络请求都是同步,上面的请求在 PHP 中可以这样写。
<?php
$str = file_get_contents("http://www.baidu.com")
echo $str;
请记住,如果你不为 file_get_contents 设定超时,这个请求将一定锁定在 file_get_contents 这里直到请求返回数据为止。
优劣
同样的,如果你从缓存中获取数据或是从数据库中获取数据,所有的操作都是同步的,不存在异步回调的情况。
同步返回的好处是,你可以非常容易地控制整个请求的逻辑,不需要担心多线程打乱你的逻辑,影响你的变量。
坏处也是很明显的,你无法预知哪个请求会在什么时候锁死在那里,因此,PHP脚本的执行时间都会有一个时长限制(一般是 30s)。
代码同步执行的特性来源于 C 语言中的思想,而 PHP 把这套思想完全继承下来了, 你只需要知道,在 PHP 的世界里,没有多线程的包袱。
网友评论