this is the issue, i write a php socket, it work as a daemon, every time, and i have a client side, the client connect but every 30 seconds client automaticaly disconnect, it is happening because socket do not send himself a line (ka();) every 30 seconds, the (ka();) line is readed by the client and keep a constant conection, i have tried making a function inside the socket, so every 30 seconds write (ka();), but it does not work, it work wrong, it show the (ka();) if the client send something to the socket, if client side do not send anything the socket do not sent the anything.
the socket work has a daemon CLI windows and the client side is just javascript, when the socket is running, can be accesed directly by navigator and read what client send, if the client do not send anything, the socket need write the (ka();) line, so it is readed by client side and keep conection and so indefinitely.
this is the socket script
error_reporting(1);
ini_set('display_errors', '1');
define('CON_IP', '127.0.0.1');
define('CON_PORT', 1000);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$max_clients = MAX_CLIENTS;
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, CON_IP, CON_PORT);
socket_listen($socket, $max_clients);
$clients = array(
'0' => array(
'socket' => $socket
)
);
echo "Server running....\n\n";
echo "Server Started on : " . date('Y-m-d H:i:s') . "\n";
echo "Listening on : " . CON_IP . " port " . CON_PORT . "\n";
echo ".... awaiting connections ...\n\n";
$session = (TRUE);
while ($session === TRUE) {
$read[0] = $socket;
for ($i = 1; $i < count($clients) + 1; ++$i) {
if ($clients[$i] != NULL) {
$read[$i + 1] = $clients[$i]['socket'];
}
}
$ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);
if (in_array($socket, $read)) {
for ($i = 1; $i < $max_clients + 1; ++$i) {
if (!isset($clients[$i])) {
$clients[$i]['socket'] = socket_accept($socket);
socket_getpeername($clients[$i]['socket'], $RemoteAddr, $RemotePort);
$clients[$i]['ipadd'] = $RemoteAddr . ':' . $RemotePort;
echo 'Incoming connection from ' . $clients[$i]['ipadd'] . "]\r\n";
break;
} elseif ($i == $max_clients - 1) {
echo 'Clients Overload!' . "\r\n";
}
if ($ready < 1) {
continue;
}
}
}
for ($i = 1; $i < $max_clients + 1; ++$i) {
if (in_array($clients[$i]['socket'], $read)) {
if (!$client[$i]['iframe']) {
$data = #socket_read($clients[$i]['socket'], 1024, PHP_BINARY_READ);
}
if (substr($data, 0, 3) == 'GET' || substr($data, 0, 4) == 'POST' || substr($data, 0, 4) == 'OPTI') {
$clients[$i]['iframe'] = true;
echo 'Incoming connection from browser [' . $clients[$i]['ipadd'] . "]\r\n";
socket_write($clients[$i]['socket'], "HTTP/1.1 200 OK\r\n");
socket_write($clients[$i]['socket'], "Content-Type: text/html; charset=utf-8;\r\n");
socket_write($clients[$i]['socket'], "Cache-Control: private\r\n\r\n");
for ($z = 0; $z < 4096; $z++)
$Brk = ("\n");
$html = ('<!DOCTYPE html>' . $Brk);
$html .= ('<html>' . $Brk);
$html .= ('<head>' . $Brk);
$html .= ('</head>' . $Brk);
$html .= ('<body>' . $Brk);
$html .= ('<script>' . $Brk);
$html .= ('function recv(packets){}' . $Brk);
$html .= ('</script>' . $Brk);
$html .= ('</body>' . $Brk);
socket_write($clients[$i]['socket'], $html);
} else {
if (trim($data) != '' && strlen(str_replace(' ', '', trim($data))) > 1) {
$msgs = ($data);
}
}
if ($data === FALSE) {
echo 'Incoming disconnection of ' . $clients[$i]['ipadd'] . "]\r\n";
unset($clients[$i]);
continue;
}
$data = trim($data);
if (!empty($data)) {
//LOGS
if ($msgs) {
$ClientDumpLog = fopen('log/InputToSocket.txt', "a");
fwrite($ClientDumpLog, "$msgs\n");
fclose($ClientDumpLog);
}
//
for ($j = 1; $j < $max_clients + 1; ++$j) {
if (isset($clients[$j]['socket']) and ($msgs !== NULL)) {
echo ('[' . $clients[$i]['ipadd'] . '] OK!' . "\r\n");
socket_write($clients[$j]['socket'], '<script>' . $msgs . "</script>\r\n");
}
}
break;
}
}
}
}
EDIT:
this solution, i think it was, but no, this code block, to test, writed after this line:
for ($j = 1; $j < $max_clients + 1; ++$j) {
$last_time = time();
while(true) {
if(time()-$last_time > 10) {
echo ('[' . $clients[$i]['ipadd'] . '] KA!' . "\r\n");
socket_write($clients[$j]['socket'], "ka();\r\n");
$last_time = time();
}
}
when i put this code, when the socket start, it show every (chosed time) in cli (KA!), when i access by navigator it show the (ka();) line too, but when the client side send something it never show, is like the (ka) line or what the client send, but no both at the same time.
somebody know some function or solution to make it work?
You have to override the maximum execution time setting of php.ini. You should not change it within php.ini - you rather should change it on top of your code:
<?php
set_time_limit(0);
//... your fancy code here...
Related
I was coded a php bot. Now I want send a 8 million request. Yeah for example:
I use multi_curl* but problems.
I use linux parallels library problems.
Maybe you have any suggestions ?
Php 7.1.1 , Linux Ubuntu 16.0.1
myfnc(){
i=1264609
echo "$(($1+i))";
response=$(curl --write-out %{http_code} --silent --output /dev/null http://localhost/botum/index.php?i=$(($1+i)))
echo $response
}
export -f myfnc
seq 100 | parallel -j0 myfnc
Multi curl problems :
set_time_limit(0);
ini_set("max_execution_time",-1);
$nodes = array();
for($i =1366295;$i<1396296;$i++){
array_push($nodes,"http://165.227.152.138/botum2/index.php?i=$i");
}
$node_count = count($nodes);
$curl_arr = array();
$master = curl_multi_init();
for($i = 0; $i < $node_count; $i++)
{
$url =$nodes[$i];
//problems code start
$curl_arr[$i] = curl_init($url);
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
//problems code end
curl_multi_add_handle($master, $curl_arr[$i]);
}
do {
curl_multi_exec($master,$running);
} while($running > 0);
for($i = 0; $i < $node_count; $i++)
{
$results[] = curl_multi_getcontent ( $curl_arr[$i] );
}
print_r($results);
your curl code is trying to start 1.3 million curl handles SIMULTANEOUSLY, and will obviously run out of resources (but you don't catch that because you don't check the return value of curl_init(), if you had done something like if(!($curl_arr[$i] = curl_init($url))){throw new \RuntimeException("curl_init failed!");} then you would have noticed it)
furthermore you're using a busy loop here
do {
curl_multi_exec($master,$running);
} while($running > 0);
meaning you'll be using 100% cpu while the handles are executing, for no goddamn reason, while you should have been waiting with curl_multi_select.
this is a job for curl_multi, but you're just using it wrong. my suggestion is to just slightly modify the code from Which performs faster, headless browser or Curl? ,
this will do 8 million requests, print the responses as they are getting completed, and never use more than 500 connections simultaneously, and use an async select() approach to not use any cpu while waiting for network IO,
curl_multi_fetch_and_print("http://165.227.152.138/botum2/index.php?i=",8000000,500,10000,true,true);
function curl_multi_fetch_and_print(string $base_url, int $count, int $max_connections, int $timeout_ms = 10000, bool $consider_http_300_redirect_as_error = true, bool $print_fault_reason): void
{
if ($max_connections < 1) {
throw new InvalidArgumentException("max_connections MUST be >=1");
}
if ($count < 1) {
throw new InvalidArgumentException("count MUST be >=1");
}
$mh = curl_multi_init();
$workers = array();
$work = function () use (&$workers, &$mh, &$print_fault_reason) {
// > If an added handle fails very quickly, it may never be counted as a running_handle
while (1) {
curl_multi_exec($mh, $still_running);
if ($still_running < count($workers)) {
break;
}
$cms = curl_multi_select($mh, 10);
//var_dump('sr: ' . $still_running . " c: " . count($workers)." cms: ".$cms);
}
while (false !== ($info = curl_multi_info_read($mh))) {
//echo "NOT FALSE!";
//var_dump($info);
{
if ($info['msg'] !== CURLMSG_DONE) {
continue;
}
if ($info['result'] !== CURLM_OK) {
if ($print_fault_reason) {
echo "request #" . ($workers[(int)$info['handle']]) . " error: " . print_r(array(false, $info['result'], "curl_exec error " . $info['result'] . ": " . curl_strerror($info['result'])), true) . PHP_EOL;
}
} elseif (CURLE_OK !== ($err = curl_errno($info['handle']))) {
if ($print_fault_reason) {
echo "request #" . ($workers[(int)$info['handle']]) . " error: " . print_r(array(false, $err, "curl error " . $err . ": " . curl_strerror($err)), true) . PHP_EOL;
}
} else {
$code = (string)curl_getinfo($info['handle'], CURLINFO_HTTP_CODE);
if ($code[0] === "3") {
if ($consider_http_300_redirect_as_error) {
if ($print_fault_reason) {
echo "request #" . ($workers[(int)$info['handle']]) . " error: " . print_r(array(false, -1, "got a http " . $code . " redirect, which is considered an error"), true) . PHP_EOL;
}
} else {
//if ($print_fault_reason) {
// echo "request #" . ($workers[(int)$info['handle']]) . " success: " . print_r(array(true, 0, "got a http " . $code . " redirect, which is considered a success"), true).PHP_EOL;
//} else {
// ... got a http redirect, which is not considered an errror,
echo "request #" . ($workers[(int)$info['handle']]) . " success: (http {$code} redirect)\n";
//}
}
} elseif ($code[0] === "2") {
if ($print_fault_reason) {
echo "request #" . ($workers[(int)$info['handle']]) . " success: http {$code}: " . curl_multi_getcontent($info['handle']) . PHP_EOL;
} else {
echo "request #" . ($workers[(int)$info['handle']]) . ": " . curl_multi_getcontent($info['handle']) . PHP_EOL;
}
} else {
// all non-2xx and non-3xx are always considered errors (500 internal server error, 400 client error, 404 not found, etcetc)
if ($print_fault_reason) {
echo "request #" . ($workers[(int)$info['handle']]) . " error: " . print_r(array(false, -1, "got a http " . $code . " code, which is considered an error"), true) . PHP_EOL;
}
}
}
curl_multi_remove_handle($mh, $info['handle']);
assert(isset($workers[(int)$info['handle']]));
unset($workers[(int)$info['handle']]);
curl_close($info['handle']);
}
}
//echo "NO MORE INFO!";
};
for ($i = 0; $i < $count; ++$i) {
$url = $base_url . $i;
while (count($workers) >= $max_connections) {
//echo "TOO MANY WORKERS!\n";
$work();
}
$neww = curl_init($url);
if (!$neww) {
trigger_error("curl_init() failed! probably means that max_connections is too high and you ran out of resources", E_USER_WARNING);
if ($print_fault_reason) {
echo "request #{$i} error: curl_init() failed!" . PHP_EOL;
}
continue;
}
$workers[(int)$neww] = $url;
curl_setopt_array($neww, array(
//CURLOPT_NOBODY => 1,
CURLOPT_RETURNTRANSFER=>1,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_TIMEOUT_MS => $timeout_ms
));
curl_multi_add_handle($mh, $neww);
//curl_multi_exec($mh, $unused_here); LIKELY TO BE MUCH SLOWER IF DONE IN THIS LOOP: TOO MANY SYSCALLS
}
while (count($workers) > 0) {
//echo "WAITING FOR WORKERS TO BECOME 0!";
//var_dump(count($workers));
$work();
}
curl_multi_close($mh);
return;
}
I'm trying to send some data (text) to the current socket.
Previously making hand shake - OK.
Then send data from client (Chrome, latest version) - socket_recv receives it - OK.
Then I'm trying to write to the same socket what I just read by socket_recv using socket_write - NOTHING.
Any errors (checked using socket_last_error and the function returns TRUE). It seems like all OK.
But onmessage event on the client-side not firing. Silence...
Who used websockets in PHP, please help.
Client:
var host = "ws://192.168.0.100:5000/wbs_r1.php";
try {
var socket = new WebSocket(host);
message('<p class="event">Socket Status: ' + socket.readyState);
socket.onopen = function (msg) {
message('<p class="event">Socket Status: ' + socket.readyState + ' (open)');
console.log(socket);
console.log(msg);
}
socket.onmessage = function (msg) {
message('<p class="message">Received: ' + msg.data);
console.log(socket);
console.log(msg);
}
socket.onclose = function (msg) {
message('<p class="event">Socket Status: ' + socket.readyState + ' (Closed)');
console.log(socket);
console.log(msg);
}
socket.onerror = function (msg) {
message('Error: ');
console.log(socket);
console.log(msg);
}
} catch (exception) {
message('<p>Error' + exception);
console.log(exception);
}
Server:
header('Content-Type: text/plain; charset=utf-8');
set_time_limit(0);
error_reporting(E_ALL);
ob_implicit_flush(true);
$sockets = array();
$handshakes = array();
$sockets["wbs1"] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sockets["wbs1"], SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sockets["wbs1"], "0.0.0.0", 5000);
socket_listen($sockets["wbs1"], 20);
socket_set_nonblock($sockets["wbs1"]);
echo $sockets["wbs1"] . "\n";
while(true) {
$changed_sockets = $sockets;
$num_sockets = socket_select($changed_sockets, $write = null, $exceptions = null, null);
//print_r($changed_sockets);
foreach($changed_sockets as $socket) {
echo "\n\n\n" . "Current socket: " . $socket . "\n";
if($socket == $sockets["wbs1"]) {
if(($client = socket_accept($sockets["wbs1"])) >= 0) $sockets[] = $client;
echo "Accepting socket ".$socket."\n";
echo "Client: " . $client . "\n";
} else {
$index = array_search($socket, $sockets);
$len = #socket_recv($socket, $buffer, 2048, 0);
echo "Received " . $len . " bytes from socket ".$socket.": " . $buffer . "\n";
if($len == 0) {
unset($sockets[$index]);
unset($handshakes[$index]);
socket_close($socket);
echo "Closing socket " . $socket . "\n";
} else if(!isset($handshakes[$index])) {
$buffer = substr($buffer, strpos($buffer, "Sec-WebSocket-Key: ") + 19);
$accept = base64_encode(sha1(substr($buffer, 0, strpos($buffer, "\r\n")) . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: {$accept}\r\n\r\n" .
"Sec-Websocket-Extensions=x-webkit-deflate-frame". chr(0);
socket_write($socket, $upgrade, strlen($upgrade));
$handshakes[$index] = true;
echo "Handshaking: " . $socket . "\n";
} else {
$msg = "Hello!!!\n\0";
$wr = socket_write($socket,$msg);
if(!$wr) echo socket_strerror(socket_last_error()) . "\n";
else echo "Writing to socket " . $socket . "\n";
}
}
}
}
I have used to the Rackspace API to upload files to the RackSpace cloud. But this method seems to be a little on the slow side. Is there a better or faster way to upload a file to the cloud(curl, http adapters, etc)?
I am currently uploading with PHP and using the provided API.
Here is my solution how to make it fast:
I'm uploading only missing files using simple PHP script below. Thanks to it I do it in just one click and in just a few seconds.
PHP source code:
function UploadMissingFilesToRackFileCDN($file_paths_to_upload, $b_force_upload = false)
{
include_once("cloudfiles.php");
// Connect to Rackspace
$username = cloudfile_username; // username
echo "Connecting to CDN..." . date("H:i:s") . "<br>"; ob_flush();
$key = cloudfile_api_key; // api key
$auth = new CF_Authentication($username, $key);
$auth->authenticate();
$conn = new CF_Connection($auth);
echo " Connected!" . date("H:i:s") . "<br>"; ob_flush();
// Get the container we want to use
$container_name = 'vladonai';//'test_container';
echo "Obtaining container $container_name..." . date("H:i:s") . "<br>"; ob_flush();
$container = $conn->get_container($container_name);
echo " The container is obtained." . date("H:i:s") . "<br>"; ob_flush();
if (!$b_force_upload)
{
echo "Receiving container objects list..." . date("H:i:s") . "<br>"; ob_flush();
$existing_object_names = $container->list_objects();
$existing_files_count = count($existing_object_names);
echo " Objects list obtained: $existing_files_count." . date("H:i:s") . "<br>"; ob_flush();
$existing_object_names_text .= "\r\n";
foreach ($existing_object_names as $obj_name)
{
$existing_object_names_text .= $obj_name . "\r\n";
}
}
// upload files to Rackspace
$uploaded_file_n = 0;
$skipped_file_n = 0;
$errors_count = 0;
foreach ($file_paths_to_upload as $localfile_path => $file_info)
{
$filename = basename($localfile_path);
if (!file_exists($localfile_path))
{
echo "<font color=red>Error! File $localfile_path doesn't exists!</font>" . date("H:i:s") . "<br>"; ob_flush();
$errors_count ++;
} else
if (is_dir($localfile_path))
{
//simply skip it
} else
if (strpos($existing_object_names_text, "\r\n" . $filename . "\r\n") !== false)
{
//file is already uploaded to CDN (at least file name is present there). Would be good to have date/size checked, but CDN api has no such feature
//echo "<font color=gray>Skipped file $localfile_path - it already exists!</font><br>"; ob_flush();
$skipped_file_n ++;
} else
{
echo "<font color=green>Uploading file $localfile_path (file #$uploaded_file_n)..." . date("H:i:s") . "</font><br>"; ob_flush();
try
{
$object = $container->create_object($filename);
$object->load_from_filename($localfile_path);
$uploaded_file_n ++;
}
catch (Exception $e)
{
echo "<font color=red>Error! Caught exception: ", $e->getMessage(), " on uploading file <strong>$localfile_path</strong>!</font>" . date("H:i:s") . "<br>"; ob_flush();
$errors_count ++;
}
}
// if ($uploaded_file_n >= 10)
// break;
}
echo "Done! $uploaded_file_n files uploaded. Disconnecting :)" . date("H:i:s") . "<br>"; ob_flush();
echo "Skipped files: $skipped_file_n<br>"; ob_flush();
if ($errors_count > 0)
echo "<font color=red>Erorrs: $errors_count</font><br>"; ob_flush();
}
function UploadChangedImagesToRackFileCDN($b_force_upload = false)
{
$exclude = array
(
'.',
'..',
'*.html',
'*.htm',
'*.php',
'*.csv',
'*.log',
'*.txt',
'*.cfg',
//'*sub/forum/files/*',
);
$files_array_images = get_dirlist("/var/www/html/vladonai.com/images/", '*', $exclude, false);
$files_array = array_merge(get_dirlist("/var/www/html/vladonai.com/js/", '*', $exclude, false), $files_array_images);
UploadMissingFilesToRackFileCDN($files_array, $b_force_upload);
}
function get_dirlist($path, $match = '*', $exclude = array( '.', '..' ), $b_short_path = true)
{
$result = array();
if (($handle = opendir($path)))
{
while (false !== ($fname = readdir($handle)))
{
$skip = false;
if (!empty($exclude))
{
if (!is_array($exclude))
{
$skip = fnmatch($exclude, $fname) || fnmatch($exclude, $path . $fname);
} else
{
foreach ($exclude as $ex)
{
if (fnmatch($ex, $fname) || fnmatch($ex, $path . $fname))
$skip = true;
}
}
}
if (!$skip && (empty($match) || fnmatch($match, $fname)))
{
$file_full_path_and_name = $path . $fname;
//echo "$file_full_path_and_name<br>";
$b_dir = is_dir($file_full_path_and_name);
$b_link = is_link($file_full_path_and_name);
$file_size = ($b_dir || $b_link) ? 0 : filesize($file_full_path_and_name);
$file_mod_time = ($b_dir || $b_link) ? 0 : filemtime($file_full_path_and_name);
$new_result_element = array();
if ($b_short_path)
$file_name = str_replace("/var/www/html/vladonai.com/", "", $file_full_path_and_name);//'[' . str_replace("/var/www/html/vladonai.com/", "", $file_full_path_and_name) . ']';
else
$file_name = $file_full_path_and_name;
$result[$file_name] = array();
$result[$file_name]['size'] = $file_size;
$result[$file_name]['modtime'] = $file_mod_time;
if ($b_dir && !$b_link)
{
//recursively enumerate files in sub-directories
$result = array_merge(get_dirlist($file_full_path_and_name . "/", $match, $exclude, $b_short_path), $result);
}
}
}
closedir($handle);
}
return $result;
}
For some reason my bot wont private message a % of people on the IRC Channel. Here is my script:
<?php
$ircServer = "///";
$ircPort = "6667";
$ircChannel = "#bots";
set_time_limit(0);
$msg = $_POST['message'];
$pr = $_POST['percentage'];
$pr /= 100;
$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS);
if ($ircSocket)
{
fwrite($ircSocket, "USER Lost rawr.test lol :code\n");
fwrite($ircSocket, "NICK Rawr" . rand() . "\n");
fwrite($ircSocket, "JOIN " . $ircChannel . "\n");
while(1)
{
while($data = fgets($ircSocket, 128))
{
echo nl2br($data);
flush();
// Separate all data
$exData = explode(' ', $data);
// Send PONG back to the server
if($exData[0] == "PING")
{
fwrite($ircSocket, "PONG ".$exData[1]."\n");
}
}
echo $eS . ": " . $eN;
}
shuffle($users);
$size = count($users);
$target = $size * $pr;
$target = $round($target);
for ($i = 0; $i <= $target; $i++) {
fwrite($ircSocket, "PRIVMSG " . $users[$i] . " :" . $msg . "\n");
}
}
?>
Here is the log on what I recieve:
:StatServ!stats#Mazzzzz.com PRIVMSG Rawr30566 :VERSION
I have even tried removing the Post data and replaced this part with this:
$msg = $_POST['message'];
With
$msg = hello;
The other people on the channel does not get a private message.
Is this your entire script? $users isn't set to anything; you probably meant to set it to an array of usernames. $round also isn't set; you probably meant to just call the built-in round() function. If you add a debugging line in the for loop you can at least tell which users (if any) should be getting messages:
for ($i = 0; $i <= $target; $i++) {
echo "Sending message to ${users[$i]}\n";
fwrite($ircSocket, "PRIVMSG " . $users[$i] . " :" . $msg . "\n");
}
The IRC protocol stuff looks right. The receive log you were worried about doesn't have anything to do with it; StatServ on the IRC server is sending your bot a CTCP VERSION request. Normally clients respond with their name and version, and StatServ probably logs it so opers can see what clients are common on the network
I have been figuring about and trying to make my IRC bot send private messages to % of users on the channel however it's not working.
Here is my script, you will understand it when you see it:
<?php
/**
* Configuration.
* Pretty self-explanatory
*/
$ircServer = "//";
$ircPort = "6667";
$ircChannel = "#//";
set_time_limit(0);
$msg = $_POST['message'];
$pr = $_POST['percentage'];
$pr /= 100;
$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS);
if ($ircSocket)
{
fwrite($ircSocket, "USER Lost rawr.test lol :code\n");
fwrite($ircSocket, "NICK Rawr" . rand() . "\n");
fwrite($ircSocket, "JOIN " . $ircChannel . "\n");
while(1)
{
while($data = fgets($ircSocket, 128))
{
echo nl2br($data);
flush();
// Separate all data
$exData = explode(' ', $data);
// Send PONG back to the server
if($exData[0] == "PING")
{
fwrite($ircSocket, "PONG ".$exData[1]."\n");
}
}
echo $eS . ": " . $eN;
}
shuffle($users);
$size = count($users);
$target = $size * $pr;
$target = $round($target);
for ($i = 0; $i <= $target; $i++) {
fwrite($ircSocket, "PRIVMSG " . $users[$i] . " :" . $msg . "\n");
}
?>
Evertime I try re-coding it here is the error: Parse error: syntax error, unexpected $end in C:\xampp\htdocs\irc.php on line 55
I am trying to make a percentage system that will shuffle the % of users on the IRC channel to private message a set % on the shuffle system.
unexpected $end means it reached the end of the file and all your blocks ({}) weren't closed. It's right, you have more open braces than close braces; you forgot to close one somewhere. Based on the indenting, I think you meant to close your inner while loop right after the if statement:
while(1)
{
while($data = fgets($ircSocket, 128))
{
echo nl2br($data);
flush();
// Separate all data
$exData = explode(' ', $data);
// Send PONG back to the server
if($exData[0] == "PING")
{
fwrite($ircSocket, "PONG ".$exData[1]."\n");
}
} // <-- THIS IS NEW
}
Just from skimming the code, I don't see anything obviously wrong with the approach, but I didn't actually try it
you forget the '}' for
if ($ircSocket) {