[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: fsockopen
ICode
Суть:
fsockopen - на локалке работает, на серве нет. Техподдержка молчит.
Вопросы:
1. Почему?
2. Чем заменить?

P.S.
скрипт проверяет домены на занятость.



Спустя 7 минут, 44 секунды (8.03.2012 - 14:21) Visman написал(а):
ICode, phpinfo()
Sockets Support включен?

UP И что в disable_functions пишут?

Спустя 3 минуты, 51 секунда (8.03.2012 - 14:25) ICode написал(а):
Visman
Оппа щас гляну. Чё то сразу не допёр. Надо больше спать )

Спустя 4 минуты, 53 секунды (8.03.2012 - 14:30) ICode написал(а):
слабо понимаю что это значит. вот что выдало
Registered Stream Socket Transports - tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
Configure Command ....--enable-sockets' '--with-regex=php' '....

Спустя 7 минут, 5 секунд (8.03.2012 - 14:37) Visman написал(а):
ICode, ошибку какую сервере пишет?

Спустя 5 минут, 17 секунд (8.03.2012 - 14:42) ICode написал(а):
Visman
В том то и дело, что ошибок не выдаёт. Вообще ничего не выдаёт

Спустя 7 минут, 15 секунд (8.03.2012 - 14:50) Visman написал(а):
ICode, лог ошибок пуст на сервере?
Если да, то из самой функции можно ошибки взять

<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br>\n";
} else {
fwrite($fp,"\n");
echo fread($fp, 26);
fclose($fp);
}
?>


И в строчке disable_functions в phpinfo посмотрел запрещенные функции?

Спустя 6 минут, 26 секунд (8.03.2012 - 14:56) ICode написал(а):
disable_functions - no value
проверял на отзыв. Фишка в том, что конструкция $fp = fsockopen ничего не возвращает, но на локалке то работает. Мистика.

Спустя 4 минуты, 35 секунд (8.03.2012 - 15:01) Visman написал(а):
Вот функция для доступа к файлам на других сайтах используемая в движке форума PunBB.
Она использует все возможные методы для доставания контента. Если один не работает, то другой и т.д.
// Attempts to fetch the provided URL using any available means
function get_remote_file($url, $timeout, $head_only = false, $max_redirects = 10)
{
$result = null;
$parsed_url = parse_url($url);
$allow_url_fopen = strtolower(@ini_get('allow_url_fopen'));

// Quite unlikely that this will be allowed on a shared host, but it can't hurt
if (function_exists('ini_set'))
@ini_set('default_socket_timeout', $timeout);

// If we have cURL, we might as well use it
if (function_exists('curl_init'))
{
// Setup the transfer
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, $head_only);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, 'PunBB');

// Grab the page
$content = @curl_exec($ch);
$responce_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Process 301/302 redirect
if ($content !== false && ($responce_code == '301' || $responce_code == '302') && $max_redirects > 0)
{
$headers = explode("\r\n", trim($content));
foreach ($headers as $header)
if (substr($header, 0, 10) == 'Location: ')
{
$responce = get_remote_file(substr($header, 10), $timeout, $head_only, $max_redirects - 1);
if ($responce !== null)
$responce['headers'] = array_merge($headers, $responce['headers']);
return $responce;
}
}


// Ignore everything except a 200 response code
if ($content !== false && $responce_code == '200')
{
if ($head_only)
$result['headers'] = explode("\r\n", str_replace("\r\n\r\n", "\r\n", trim($content)));
else
{
preg_match('#HTTP/1.[01] 200 OK#', $content, $match, PREG_OFFSET_CAPTURE);
$last_content = substr($content, $match[0][1]);
$content_start = strpos($last_content, "\r\n\r\n");
if ($content_start !== false)
{
$result['headers'] = explode("\r\n", str_replace("\r\n\r\n", "\r\n", substr($content, 0, $match[0][1] + $content_start)));
$result['content'] = substr($last_content, $content_start + 4);
}
}
}
}

// fsockopen() is the second best thing
else if (function_exists('fsockopen'))
{
$remote = @fsockopen($parsed_url['host'], !empty($parsed_url['port']) ? intval($parsed_url['port']) : 80, $errno, $errstr, $timeout);
if ($remote)
{
// Send a standard HTTP 1.0 request for the page
fwrite($remote, ($head_only ? 'HEAD' : 'GET').' '.(!empty($parsed_url['path']) ? $parsed_url['path'] : '/').(!empty($parsed_url['query']) ? '?'.$parsed_url['query'] : '').' HTTP/1.0'."\r\n");
fwrite($remote, 'Host: '.$parsed_url['host']."\r\n");
fwrite($remote, 'User-Agent: PunBB'."\r\n");
fwrite($remote, 'Connection: Close'."\r\n\r\n");

stream_set_timeout($remote, $timeout);
$stream_meta = stream_get_meta_data($remote);

// Fetch the response 1024 bytes at a time and watch out for a timeout
$content = false;
while (!feof($remote) && !$stream_meta['timed_out'])
{
$content .= fgets($remote, 1024);
$stream_meta = stream_get_meta_data($remote);
}

fclose($remote);

// Process 301/302 redirect
if ($content !== false && $max_redirects > 0 && preg_match('#^HTTP/1.[01] 30[12]#', $content))
{
$headers = explode("\r\n", trim($content));
foreach ($headers as $header)
if (substr($header, 0, 10) == 'Location: ')
{
$responce = get_remote_file(substr($header, 10), $timeout, $head_only, $max_redirects - 1);
if ($responce !== null)
$responce['headers'] = array_merge($headers, $responce['headers']);
return $responce;
}
}


// Ignore everything except a 200 response code
if ($content !== false && preg_match('#^HTTP/1.[01] 200 OK#', $content))
{
if ($head_only)
$result['headers'] = explode("\r\n", trim($content));
else
{
$content_start = strpos($content, "\r\n\r\n");
if ($content_start !== false)
{
$result['headers'] = explode("\r\n", substr($content, 0, $content_start));
$result['content'] = substr($content, $content_start + 4);
}
}
}
}
}

// Last case scenario, we use file_get_contents provided allow_url_fopen is enabled (any non 200 response results in a failure)
else if (in_array($allow_url_fopen, array('on', 'true', '1')))
{
// PHP5's version of file_get_contents() supports stream options
if (version_compare(PHP_VERSION, '5.0.0', '>='))
{
// Setup a stream context
$stream_context = stream_context_create(
array(
'http' => array(
'method' => $head_only ? 'HEAD' : 'GET',
'user_agent' => 'PunBB',
'max_redirects' => $max_redirects + 1, // PHP >=5.1.0 only
'timeout' => $timeout // PHP >=5.2.1 only
)
)
);


$content = @file_get_contents($url, false, $stream_context);
}
else
$content = @file_get_contents($url);

// Did we get anything?
if ($content !== false)
{
// Gotta love the fact that $http_response_header just appears in the global scope (*cough* hack! *cough*)
$result['headers'] = $http_response_header;
if (!$head_only)
$result['content'] = $content;
}
}


return $result;
}

Спустя 4 минуты, 16 секунд (8.03.2012 - 15:05) ICode написал(а):
Visman
спасибо за функцию, по любому пригодится.
Чем заменить теперь понятно.
Почему не работает fsockopen буду долбить техподдержку.

Спустя 23 часа, 23 минуты, 44 секунды (9.03.2012 - 14:29) Zerstoren написал(а):
Цитата (ICode @ 8.03.2012 - 12:05)
Visman
спасибо за функцию, по любому пригодится.
Чем заменить теперь понятно.
Почему не работает fsockopen буду долбить техподдержку.

Были случаи у меня подобные. Но не только с сокетами.
В общем сайт не мог конектиться к внешним базам. Соответствено сокеты тоже были закрыты.

Но сокет давал инфу что не могу подключиться к удаленному адресу.

Спустя 8 часов, 4 минуты, 36 секунд (9.03.2012 - 22:33) ICode написал(а):
Короче достучался до техподдержки. Вот кусок переписки:
Вы: Доброй ночи.
Вопрос следующего плана.
fsockopen - на локалке работает, на серве нет, в чём может быть причина ? Функция ничего не возвращает.
С уважением, Александр.
1Gb.ru: fsockopen у нас не работает
Вы: Чем заменить не подскажете?
1Gb.ru: нет, не знаю
Вы: А не подскажете, есть-ли у вас специалисты по этим вопросам и как с ними связаться?
1Gb.ru: я оставлю тут комментарий, завтра может кто-нибуть вам ответит.
------------------------
Жесть да. Я в шоке. И я им плачу косарь за полгода. Нафиг переезжать надо.
P.S.
Только что спец ихний отписал таки. Предложил купить VDS типа так сто пудов будет работать. Кто нить знает норм хост где соккеты на виртуалке работают ?

Спустя 2 часа, 3 минуты, 36 секунд (10.03.2012 - 00:37) killer8080 написал(а):
ICode
вряд ли есть платные хостинги, где не работают сокеты. Скорей всего консультант сапорта просто не компетентен в php. Сокеты поддерживаются на уровне ядра php, раз fsockopen не заблокирована через disable_functions, значит должно работать. Скорей всего у тебя в коде ошибки, а вывод ошибок заблокирован. Попробуй так
error_reporting(E_ALL);
function_exists('fsockopen') or die('function not available');
$f = fsockopen('ya.ru', 80, $errno, $errstr, 5) or die($errstr);
fclose($f);
echo 'sockets are working';

Спустя 45 минут, 58 секунд (10.03.2012 - 01:23) ICode написал(а):
killer8080
пишет sockets are working
вот моя функция,на локалке пашет на хосте нет. Как идея может айпи в бане.
function checkDomain($domain,$server,$findText){
// Open a socket connection to the whois server
$con = fsockopen($server, 43);
if (!$con) return false;
// Send the requested doman name
fputs($con, $domain."\r\n");
// Read and store the server response
$response = ' :';
while(!feof($con)) {
$response .= fgets($con,128);
}
// Close the connection
fclose($con);
// Check the response stream whether the domain is available
// echo $response;

if (strpos($response, $findText)){
return true;
}
else {
return false;
}
}


Спустя 10 часов, 40 минут, 37 секунд (10.03.2012 - 12:03) killer8080 написал(а):
ICode
ну для начала надо бы показать как ты эту функцию вызываешь. Нужна проверка домена именно через whois? ДНС не устраивает?

Спустя 55 минут, 5 секунд (10.03.2012 - 12:58) ICode написал(а):
killer8080
По всякому вызывал. Бестолку. А как через ДНС?

Спустя 40 минут, 41 секунда (10.03.2012 - 13:39) killer8080 написал(а):
Цитата (ICode @ 10.03.2012 - 11:58)
А как через ДНС?

function check_domain($domain){
return gethostbyname($domain) != $domain;
}

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.