Начало Новини Маркет Проекти Форум ИТ Работа Уроци Скриптове WiFi точки Още Вход


PHP Ping със Pear

От Mutatos / 04.11.2011 00:33
Размер на шрифта: A | A | A

Този урок предполага, че имате работеща инсталация на Pear, която се актуализира. По време на това урока, ще използваме Net_Ping 2.4.3.

Инсталиране на  Net_Ping
Както винаги, инсталирането на PEAR  е изключително проста. Отворете терминал или SSH във вашия бокс и издадете командата:

CODE
1
# pear install net_ping

Ако всичко върви добре, трябва да видите такъв резулта:

CODE
1
2
3
4
downloading Net_Ping-2.4.3.tgz ...
Starting to download Net_Ping-2.4.3.tgz (9,634 bytes)
.....
done: 9,634 bytes
install ok
: channel://pear.php.net/Net_Ping-2.4.3

Сега имате PEAR:: Net_Ping инсталиран.

Друга възможност: Ако вашият хостинг е с изтекъл C panel,то можете да инсталирате PEAR модули чрез Cpanel GUI.

Използване на модула
Използване на PEAR Package е толкова лесно, колкото и неговото включване.

CODE
1
require ("Net/Ping.php");

Сега ще трябва да се създаде обекта:
CODE
1
$pingObj = Net_Ping::factory();

Може да изберете ping IP или име.

CODE
1
2
$response = $pingObj->ping('codecall.net');
print_r($response);

Пълният скрипт изглежда по този начин.
CODE
1
2
3
4
5
6
7
8
<?php
require ("Net/Ping.php");

$pingObj = Net_Ping::factory();
$response = $pingObj->ping('codecall.net');
print_r($response);

?>

Този пример е най-основният и дори не се налага да проверите, дали PEAR обектът е бил създаден. Използването на IS ERROR функцията на PEAR можем да определим, ако обектът има  грешка.

ISERROR () проверява дали дадена променлива PEAR_Error обект съдържа точното съобщение за грешка или код. Прочетете още: Наръчник на PEAR - PEAR:: ISERROR ()

Добавяйки, това в нашия код, става.
CODE
1
2
3
4
5
6
7
8
9
10
11
12
<?php
require ("Net/Ping.php");

$pingObj = Net_Ping::factory();

if(PEAR::isError($ping)) {
        
echo $ping->getMessage();
 
} else {
        
$response = $pingObj->ping('codecall.net');
        
print_r($response);
}
?>


Ако изпълните кода по-горе вие ще получите някои лоши резултати:

Net_Ping_Result Object ( [_icmp_sequence] => Array ( [0] => 114 [1] => 139 [2] => 101 ) [_target_ip] => 67.205.118.30 [_bytes_per_request] => 32 [_bytes_total] => 96 [_ttl] => 50 [_raw_data] => Array ( [0] => [1] => Pinging codecall.net [67.205.118.30] with 32 bytes of data: [2] => Reply from 67.205.118.30: bytes=32 time=114ms TTL=50 [3] => Reply from 67.205.118.30: bytes=32 time=139ms TTL=50 [4] => Reply from 67.205.118.30: bytes=32 time=101ms TTL=50 [5] => [6] => Ping statistics for 67.205.118.30: [7] => Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), [8] => Approximate round trip times in milli-seconds: [9] => Minimum = 101ms, Maximum = 139ms, Average = 118ms ) [_sysname] => windows [_round_trip] => Array ( [min] => 101 [max] => 139 [avg] => 118 ) [_transmitted] => 3 [_received] => 3 [_loss] => 0 )


Можете да поправите това, чрез добавяне на  <pre> </pre> tags в масива

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
require ("Net/Ping.php");

$pingObj = Net_Ping::factory();

if(PEAR::isError($ping)) {
        
echo $ping->getMessage();
 
} else {
        
$response = $pingObj->ping('codecall.net');

    
echo "<pre>";
        
print_r($response);
    
echo "</pre>";
}
?>


Който ще произведе по-естетичен резултат.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Net_Ping_Result Object
(
    [
_icmp_sequence] => Array
       
(
            [
0] => 95
           
[1] => 152
           
[2] => 118
       
)

    [
_target_ip] => 67.205.118.30
   
[_bytes_per_request] => 32
   
[_bytes_total] => 96
   
[_ttl] => 50
   
[_raw_data] => Array
       
(
            [
0] =>
           
[1] => Pinging codecall.net [67.205.118.30] with 32 bytes of data:
           
[2] => Reply from 67.205.118.30: bytes=32 time=95ms TTL=50
           
[3] => Reply from 67.205.118.30: bytes=32 time=152ms TTL=50
           
[4] => Reply from 67.205.118.30: bytes=32 time=118ms TTL=50
           
[5] =>
           
[6] => Ping statistics for 67.205.118.30:
           
[7] =>     Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
           
[8] => Approximate round trip times in milli-seconds:
           
[9] =>     Minimum = 95ms, Maximum = 152ms, Average = 121ms
       
)

    [
_sysname] => windows
   
[_round_trip] => Array
       
(
            [
min] => 95
           
[max] => 152
           
[avg] => 121
       
)

    [
_transmitted] => 3
   
[_received] => 3
   
[_loss] => 0
)

Аргументи
Кодът по-горе не е много полезен, не прави нищо. За целта е необходимо да се направи проверка на размера _loss Packet и има нужда да се ограничи пинг до 1.

Погледнах през документацияа и претърсих в уеба, но не можах да намеря никъде списъка на аргументите . На пръв поглед той изглежда като по-горния код, тъй като можете да контролирате обекта Ping, така че чрез Net / Ping.php файл и открих setArgs () функцията и _createArgList () функцията. В _createArgList () функцията е списък на paramters от кайто можете да премине към setArgs:

CODE
1
2
3
4
5
6
7
8
timeout
iface
ttl
count
quiet
size
seq
deadline

Както можете да видите горе, повечето възможности за пинг са за преминаване през аргументи.

Настройка на аргументи
За да настроите аргументите трябва да преминете към метода, асоциативен масив setArgs () . Ето как:
CODE
1
$pingObj->setArgs(array('count' => 1, 'ttl' => 50, 'timeout' => 100));


Ето пълният скрипт;

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php

/**
 *
Include the PEAR Ping Class
 *
 *
@uses Pear::Net_Ping
 * 
 */
require ("Net/Ping.php");

/**
 *
Create the Ping Object/Class
 */
$pingObj = Net_Ping::factory();

/**
 *
If there is no error in creating the
 *
ping class then ping our source
 */
if(PEAR::isError($ping)) {
        
echo $ping->getMessage();
 
} else {
  
// Set the arguments
   
$pingObj->setArgs(array('count' => 1, 'ttl' => 50, 'timeout' => 100));

  
// Ping the Host
   
$response = $pingObj->ping('codecall.net');
       
   
print "<pre>";
   
print_r($response);
   
print "</pre>";
}


?>

По време на работата съм добавил още няколко функции, които не са от значение тук. По-долу ще ви покаже по-по-добре необходимостта за системата.

Практическа необходимост
Джъстин от AmpHosted.com, необходими за пинг скрипт, който го емайл при неуспех. Сървър CodeCall, ще работи на всеки 5 минути (чрез Cron работа)и изпраща сигнал, ако сървъра му е паднал. Тук са неговите изисквания:

1.10 пинг @ 5 минутни интервали (контролиран чрез Cron)
   2. Имейл @ 90% неуспех сигнал (9 / 10 пинг не успяват)
   3. Server IP: 74.55.90.58 (AmpHosted.com)
   4. Исканата информация - Грешка във времето, Ping реагира

Взимайки информацията отгоре можем да създадем прост Ping скрипт.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php

//
{{{ Header
/**
 *
AmpHosted.com Ping Test Script
 *
 *
Pings AmpHosted.com 9 times and determines fail rate
 *
 *
PHP versions 4 and 5
 *
 *
LICENSE:
 *
 *
Copyright (c) 2008 CodeCall.net
 *
All rights reserved.
 *
 *
Redistribution and use in source and binary forms, with or without
 *
modification, are permitted under the terms of the BSD License.
 *
 *
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 *
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 *
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 *
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *
POSSIBILITY OF SUCH DAMAGE.
 *
 *
@category  Reports     
 *
@author    Jordan (CodeCall.net)
 *
@date     10-2-2008
 *
@version   1.0
 *
@link      http://www.codecall.net
 *
@copyright 2008 CodeCall.net
 *
@uses      PEAR::Net_Ping and Beyond
 */

//
}}}
//
{{{ Includes
/**
 *
Include the PEAR Ping Class
 * 
 */
require ("Net/Ping.php");

//
}}}
//
{{{ PHP Time Limit

/**
 *
If the server is unresponsive
 *
the script may take longer to
 *
respond than the default 30 seconds
 *
 */
set_time_limit(200);

//
}}}
//
{{{ Defines

/**
 *
Define our paramters
 */
define('FAILURE_RATE', 9);
define('PING_RATE', 10);
define('HOST_NAME', '74.55.90.58');
define('TIMEOUT', 200);

//
}}}
//
{{{ Variables

/**
 *
Common Email Variables
 */
$emailBody         = FAILURE_RATE
                 .
" or more pings failed!"
                 .
PHP_EOL
                 .
"Ping Results: "
                  ;                                        
$emailSubject     = "Ping Respinse Failed - AmpHosted01";
$emailAddress     = "some@email.com";       

//
}}}
//
{{{ Content

/**
 *
Create the Ping Object/Class
 */
$pingObj = Net_Ping::factory();

/**
 *
If there is no error in creating the
 *
ping class then ping our source
 */
if(PEAR::isError($ping)) {
        
echo $ping->getMessage();
 
} else {
  
// Set the arguments
   
$pingObj->setArgs(array('count' => PING_RATE, 'timeout' => TIMEOUT));

  
// Ping the Host
   
$response = $pingObj->ping(HOST_NAME);
       
  
// Determine the fail rate
   
if ($response->getLoss() >= FAILURE_RATE) {
       
foreach($response->getRawData() as $data) {
           
$emailBody .= $data . PHP_EOL;   
       
}
       
      
// Send email
        mail
($emailAddress, $emailSubject, $emailBody);
       
      
// Print Error
       
echo "Error, sending Email!" . PHP_EOL;
   
}
       
}


//
}}}

?>

Бележка
Ако сте под Cpanel хостинг и сте инсталирали PEAR скриптове чрез Cpanel или чрез SSH, ще трябва да използва пълният включен път. Можете да намерите пълния PEAR  път, като използвате "CPanel / PHP PEAR пакети". Мястото на CodeCall PEAR  е "/home/codecall/php", така че Net_Ping, ще изглежда така:
CODE
1
require ("/home/codecall/php/Net/Ping.php");

Етикети: Ping | Net Ping | pear | PHP
Статистика
Погледнат: пъти
Гласове: --
Оценка:
Действие
 



myTech.bg © 2004 - 2011 | Контакти | За реклама