I have a program the is used to provision a VPS via API. The core part of the script will keep hitting the API (every 5 second, 15 times) till the API spits back an IP address. It takes about 30 sec to execute.
There is no error in the code and the program performs it's function with 97% reliability.
But if an enduser gets impatient and clicks away, the script will end prematurely and my system breaks.
Is there a way to execute a portion of a php script as a deamon running in the background? That way if the user clicks away on accident, the process still runs? Or some other method?
script:
<?php
session_start();
require_once('../pages/mail/config.php');
DCID=1&VPSPLANID=1&SNAPSHOTID=df55172be2c87');
$cust_label = $_POST['sname'];;
//here we provision the server with vultr
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://api.vultr.com/v1/server/create?api_key=nnnnnn1eSKIee");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
"DCID=19&VPSPLANID=31&OSID=164&SNAPSHOTID=c24554280420a&label=".$cust_label."&enable_ipv6=yes");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
curl_close ($ch);
//recovering the IP takes a little while
sleep(15);
echo 'first we get your IPv4 address';
//now we need the ip address
function getlist(){
$list_output = file_get_contents('https://api.vultr.com/v1/server/list?api_key=ddddddIOCe');
return $list_output;
}
$output = getlist();
$decoded = json_decode($output, true);
foreach($decoded as $value) {
$ip = $value['main_ip'];
$label = $value['label'];
$subid = $value['SUBID'];
//if the label matched the current on it session, get that data
if($label === $cust_label) {
$ipr = $ip;
}
}
//this one will get it
for ($x = 0; $x <= 15; $x++){
if($ipr === '0'){
sleep(5);
$output2 = getlist();
$decoded2 = json_decode($output2, true);
foreach($decoded2 as $value2) {
$ipd = $value2['main_ip'];
$label = $value2['label'];
$subid = $value['SUBID'];
if($label === $cust_label){
$ipr = $ipd;
break;
}
}
}
}
//no IPv4 is bad. error out and send a message to admin
if($ipr === '0'){
echo 'Something bad happened, we did not get and IP address back. A message has been sent to admin to review your account';
echo '<a id="ticket" target="_self" href="support/viewforum.php?f=4">Support Portal</a>';
echo '<a id="home" target="_self" href="index.php?p=home"><i>Home</i></a>';
$to = 'postmaster@ex-ler.com';
$subject = 'New entry failure';
$message = 'VPS initialization error occured';
$headers = 'From: postmaster@ex-ler.com' . "\r\n" .
'Reply-To: webmaster@ex-ler.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
exit();
}
//let's try and get the IPv6
$output3 = getlist();
$decoded3 = json_decode($output3, true);
foreach($decoded3 as $value3) {
$ipv6 = $value['v6_main_ip'];
$label = $value['label'];
$subid = $value['SUBID'];
if($label === $cust_label) {
$ipr6 = $ipv6;
}
}
$count = 0;
for ($x = 0; $x <= 25; $x++){
if(empty($ipr6)){
sleep(5);
echo 'here '.$x;
$output4 = getlist();
$decoded4 = json_decode($output4, true);
foreach($decoded4 as $value4) {
$ipdv6 = $value4['v6_main_ip'];
$label = $value4['label'];
$subid = $value['SUBID'];
if($label === $cust_label){
$ipr6 = $ipdv6;
break;
}
}
}
}
$_SESSION['label'] = $value['label'];
$_SESSION['SUBID'] = $value['SUBID'];
var_dump($_SESSION['SUBID']);
$domain = $_SESSION['DOMAIN'];
//now sink the IPs into the database
$pdo = new PDO(
'mysql:host=' . DB_HOST . ';dbname=' . DB_DATABASE, DB_USER, DB_PASSWORD
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
//$sql = 'INSERT into domains(label, ipv4) VALUES (:label, :ipaddress)';
$sql = 'UPDATE domains SET subid = :subid, label = :label, ipv4 = :ipaddress, ipv6 = :ipv6address WHERE domain = :domain';
$statement = $pdo->prepare($sql);
$statement->bindParam(':label', $cust_label, PDO::PARAM_STR, 12);
$statement->bindParam(':ipv6address', $ipr6, PDO::PARAM_STR, 48);
$statement->bindParam(':ipaddress', $ipr, PDO::PARAM_STR, 12);
$statement->bindParam(':domain', $domain, PDO::PARAM_STR, 255);
$statement->bindParam(':subid', $subid, PDO::PARAM_INT, 14);
$result = $statement->execute();
//go to member profile
header("location: ../index.php?p=member-profile");
?>