首页 > 编程技术 > php

php curl随机ip地址抓取内容例子

发布时间:2016-11-25 15:31

php curl 我们可以模仿用户行为了,这个可以设置我们访问的ip及浏览器信息还可以设置post方式了,这里我们来看php curl抓取时ip地址随机设置的方法。

  curl是一个特别牛逼的东西!~ 居然还可以生成随机的ip来访问,只可以让服务器非别不出真实ip。这个很6!有人说这个是不算bug的bug。不过有这个功能也给我们带来了很大的方便。 php curl 随机ip访问
 

<?php


function curl($url,$ifpost = 0, $datafields = '', $cookiefile = '', $v = false){
 $ip_long = array(
             array('607649792', '608174079'), //36.56.0.0-36.63.255.255
             array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
             array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
             array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
             array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
             array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
             array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
             array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
             array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
             array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
     );
     $rand_key = mt_rand(0, 9);
     $ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));
 

$header = array("Connection: Keep-Alive","Accept: text/html, application/xhtml+xml, */*", "Pragma: no-cache", "Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3","User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)",'CLIENT-IP:'.$ip,'X-FORWARDED-FOR:'.$ip);
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER, $v);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
 $ifpost && curl_setopt($ch, CURLOPT_POST, $ifpost);
 $ifpost && curl_setopt($ch, CURLOPT_POSTFIELDS, $datafields);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 $cookiefile && curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
 $cookiefile && curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
 curl_setopt($ch,CURLOPT_TIMEOUT,30); //允许执行的最长秒数
 $ok = curl_exec($ch);
 curl_close($ch);
 
unset($ch);
 return $ok;
 
}
 print_r(curl("URL"));

?>

PHP 7.1 新功能之 Nullable Type对于各位要了解的朋友可能会有所帮助的哦,下面我们就一起来看看吧,具体的细节如下文介绍。

在 PHP5 时代,PHP 的参数已经支持 type hint(除了基本类型),想必大家应该很熟悉;后来 PHP7 时代来临,PHP 也可以指定返回值的类型(以及基本类型的 type hint)。但我们可能还有一种需求:除了指定的 type hint,参数或者返回值也能定义可以为 null,举个例子,假如我们有一个 UserRepository 类,有一个方法叫 find($id),此方法可返回一个 User 对象,也可返回 null,在 PHP7.1 里就可以这么定义了:

...
 
class UserRepository
{
    ...
 
    public function find($id): ?User
    {
        ...
 
        return $user;
        // or
        // return null;
    }
}

但这么申明以后,如果返回 null,是否必须显式调用 return null,这就得等 7.1 正式出来之后再验证了。

当然还有参数设定是否 nullable 的例子,直接复制官网里的例子:


function say(?string $msg) {
    if ($msg) {
        echo $msg;
    }
}
 
say('hello'); // ok -- prints hello
say(null); // ok -- does not print
say(); // error -- 丢失属性
say(new stdclass); //error -- 类型错误
以上便是 nullable type 的大致用法,但其实引入了此种机制以后,有很多细节都是需要注意的,比如在继承的时候,子类允许去掉父类同名方法的返回类型为 nullable 的设置:

interface Fooable
{
    public function foo(): ?Fooable;
}
 
interface StrictFooable extends Fooable
{
    public function foo(): Fooable; // valid
}

但反过来,子类是不允许添加返回类型可以为 nullable 的。

然后我们再来看看参数类型的情况。跟返回类型相反,子类在复写父类方法时,参数类型是可以在父类参数的基础上添加 nullable 属性的:

interface Fooable
{
    public function foo(Fooable $f);
}
 
interface LooseFoo extends Fooable
{
    function foo(?Fooable $f);
}

反过来不行。可能刚看到这点,大家都会有疑问为什么返回类型和参数类型会有这样的设定。其实大家想想 Liskov 替换原则就明白了。

最后是关于参数默认值的问题,目前 PHP 是可以这样做的:


function foo_default(Bar $bar = null) {}
 
foo_default(new Bar); // valid
foo_default(null); // valid
foo_default(); // valid

但如果改成 nullable 的类型申明,即使传入的参数是 null,也不能在调用的时候省略不写:

function foo_nullable(?Bar $bar) {}
 
foo_nullable(new Bar); // valid
foo_nullable(null); // valid
foo_nullable(); // INVALID!

由此可见 nullable 类型的目的是为了允许某个参数带类型而且可以为 null,而默认值为 null 的参数就真的是想告诉大家某个参数的默认值是 null。以前我们如果允许某些 setter 可以置空,写的代码总是觉得怪怪的:


public function setIssueAt(\DateTime $issueAt = null)

觉得怪最大的原因我想是因为这样的一个 setter 居然可以不传参数!

这下好了,有了 nullable type,我们也就不会写那么别扭的代码了。

当然,nullable type 和 = null 是可以同时用的。这里就不写例子了,效果跟只用 = null 没有区别。

最后,还是继承:如果父类方法参数是 nullable 的,那么子类可以使用 = null


interface Contract
{
    public function method(?Foo $foo): bool;
}
 
class Implementation implements Contract
{
    public function method(?Foo $foo = null): bool
    {
        return is_null($foo);
    }
}

PHP7 新特性新功能有哪些?对于新版本我们都会有一些升级更新了,下面我们来为各位介绍一下关于PHP7 新特性新功能吧,具体的如下。


PHP7 就要到来,网上也散布许多零散的相关的消息,PHP7 到底都有些什么改变?我们 PHPer 又将需要做什么改变,本篇博客将尝试一一列举。


PHP7 跟以前不兼容的地方

由于采纳了 AST(Abstract Syntax Tree) 以及 Uniform Variable Syntax,有些代码的意义会有变化,比如:

$obj->$properties['name']
 
// PHP5.6里等价于
$obj->{$properties['name']}
 
// 但在PHP7等价于
{$obj->$properties}['name']
为了以后升级 PHP7 的时候避免出现问题,目前的可以通过用大括号把代码写得更明确一些。

性能

由于 phpng 的采纳,性能将得到提升,这应该是 PHP7 聊得最多的话题了,当然,这种对于终端用户仅靠升级 PHP 就可以无痛提升性能的事情,肯定是大家最感兴趣的。除了运行性能的提升以外,内存占用也能得到一定改善,因为数据存储的结构也得到进一步优化。

低版本兼容

有些兼容代码将被取消掉,比如以前的 ASP 风格的开始标签以及 <script language="php"> 开始标签。

另外还有一大波功能或扩展即将被移除,比如 ext-mysql。

有一个有趣的小改变是,在 switch 里将不允许使用多个 default 语句(什么!以前可以吗?)。

新功能(此处应该有掌声)

尿点已过,精彩的部分已经到来。

普通变量的类型限制以及返回类型

话说之前,是否要给普通变量添加类型限制(也就是在函数定义时像 C 一样需要限制普通类型参数是 int,float 等类型)的 RFC 几乎被 PHP 社区全票通过,但是提议的作者却离开了 PHP 开发组,以及撤销了 RFC……结果导致后来又出现多个关于类型限制的 RFC,并且为了具体实现方式而相互掐架……不过最后还是原提案通过了最终决策。

好吧,对于我们终端用户来说,我们现在可以给普通变量添加类型限制了。不过默认情况类型限制并不是严格的,什么意思呢,比如 function foo(int $bar) {} 这个函数,如果第一个参数传入的是字符串 "123",并不会报错,而是被传换成了数字 123 之后,再传递给变量 $bar。

不过,我们可以通过在文件最上方添加代码 declare(strict_types=1) 来改变默认行为,这个时候如果刚才的函数传入的第一个参数还是字符串,那么就会产生 Fatal Error。

另外,PHP7 也支持定义返回类型,并且行为跟参数是类似的:

function isEven(int $number): bool
{
    return $number % 2 === 1;
}

组合对比操作符

以前要对比两个数字是 A 大于 B,还是 A 小于 B,还是 A 等于 B,至少得写两个判断:

($a < $b) ? -1 : (($a > $b) ? 1 : 0)

有了组合对比操作符,上面的代码等同于

$a <=> $b
 
在PHP内核代码里,<=> 操作符叫做“T_SPACESHIP”(太空舰)……叫太空舰操作符或者宇宙飞船操作符还是很霸气的有木有。

Unicode 转义语法

你可以在字符串里使用 \u{xxxx} 来表示一个 unicode 字符。

?? 操作符

类似 ?: 操作符,但等价于 isset($foo) ? $foo : false

// 如果 $foo 不为 null,返回 $foo,否则返回 'default'
$foo ?? 'default'
 
// ??可以连续调用
$config = $config ?? $this->config ?? static::$defaultConfig;

匿名函数绑定

PHP5.4 的时候已经可以将一个方法绑定在一个对象上,在 PHP7 里实现更加简单:

class HelloWorld
{
     private $greeting = "Hello";
}
 
$closure = function($whom) { echo $this->greeting . ' ' . $whom; }
 
$obj = new HelloWorld();
$closure->call($obj, 'World'); // Hello World
Use 语句分组

在 PHP7 之前,use 语句只能这么写

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

PHP7 可以这么写了


use Symfony\Componenet\HttpFoundation {
    Request;
    Response;
}
 
改进版生成器

在 PHP7 之前,生成器是不能有返回值的,否则会报错。不过 PHP7 里是没有问题的,只需要调用一下getReturn()方法即可。


function gen() {
    yield "Hello";
    yield " ";
    yield "World!";
 
    return "Goodbye Moon!";
}
 
$gen = gen();
 
foreach ($gen as $value) {
    echo $value;
}
 
// Outputs "Hello" on iteration 1, " " on iterator 2, and "World!" on iteration 3
 
echo $gen->getReturn(); // Goodbye Moon!
 
生成器委托

PHP7 还支持生成器的相互委托,例如:

function hello() {
     yield "Hello";
     yield " ";
     yield "World!";
 
     yield from goodbye();
}
 
function goodbye() {
     yield "Goodbye";
     yield " ";
     yield "Moon!";
}
 
$gen = hello();
foreach ($gen as $value) {
     echo $value;
}
 
上面代码在每一次迭代的时候会依次输出 "Hello" " " "World!" "Goodbye" "Moon!",当然,自己委托自己也是可以的,只不过得小心不要死循环了。

更多的 Exception 类型

在 PHP7,内部错误也将采用 Exception 的方式抛出。当然他是单独的类型,叫 \EngineException,以后许多错误都将被 EngineException 代替。

除此之外,eval() 里的代码如果出现错误,将会抛出 \ParseException,如果函数的参数类型发现与传参不匹配,会抛出 \TypeException。如果要同时处理传统的 Exception 和 EngineException,那就得捕获他们共有的基类 \BaseException

好啦,PHP7 的新功能差不多就这些了,期待 PHP7 的到来吧。

PHP 7.1新功能有不少哦今天我们来看PHP 7.1 方括号数组符号多值复制和指定键值赋值的例子,具体的如下。


PHPer 们可能都知道 list 的用法,简单来说就是可以在一个表达试里通过数组对多个变量赋值:

$values = array('value1', 'value2');
$list($v1, $v2) = $values;

感觉是不是很方便呢?在 PHP 7.1 中,还能更省事儿:


[$v1, $v2] = ['foo', 'bar'];

这还不是最给力的,在 PHP 7.1 里我们还可以指定键值来赋值,从而不用关心数组元素的顺序:

list('v1' => $value1, 'v2' => $value2) = array('v1' => 'foo', 'v2' => 'bar', ...);
 
// or
['v1' => $value1, 'v2' => $value2] = ['v1' => 'foo', 'v2' => 'bar', ...];

其实在 PHP 5 的年代,list 就有一个很不错的用法可能大家都不熟悉:


$arr = [
    ['x', 'y'],
    ['x1', 'y2'],
];
 
foreach ($arr as list($x, $y)) {
    echo $x, ' ', $y, PHP_EOL;
}

到了 PHP 7.1,因为可以指定键值赋值,这种用法将更加的灵活,估计也更加常用:


$arr = [
    ['x' => 1, 'y' => '2'],
    ['x' => 2, 'y' => '4'],
];
 
foreach ($arr as ['x' => $x, 'y' => $y)) {
    echo $x, ' ', $y, PHP_EOL;
}

再看看一个官网的例子,是不是感觉好像春风拂面一样清爽:

class ElePHPant
{
    private $name, $colour, $age, $cuteness;
 
    public function __construct(array $attributes) {
        // $this->name = $attributes['name']; // 以前
       
        // 现在
        [
            "name" => $this->name,
            "colour" => $this->colour,
            "age" => $this->age,
            "cuteness" => $this->cuteness
        ] = $attributes;
    }
 
    // ...
}

值得一提的是:此种赋值方式,是可以嵌套使用的!

[[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];

最后,在 PHP 7.1 的提案里有一个展望,也非常值得期待:

class ElePHPant
{
    private $name, $colour, $age, $cuteness;
 
    public function __construct(["name" => string $name, "colour" => \Colour $colour, "age" => int $age, "cuteness" => float $cuteness]) {
        $this->name = $name;
        $this->colour = $colour;
        $this->age = $age;
        $this->cuteness = $cuteness;
    }
 
    // ...
}
如果 PHP 推出此语法,那么参数列表将不再关心参数顺序,PHP 的小伙伴将不再羡慕 Ruby 的小伙伴啦!

标签:[!--infotagslink--]

您可能感兴趣的文章: