Utføre PHP-script remote

Hei,

Jeg har en haug med domener, som alle har en fil liggende slik:

domene.no/filen.php

Den filen utfører en spesiell oppgave, og vha cron og curl besøkes den en gang i døgnet.

Men, for hvert nye domene, må jeg opprette en ny cron-jobb, og det er bare en del arbeid. Så da tenkte jeg kunne gjøre det noe enklere.

Jeg har en liste over alle domener, la oss si [code]
$urls = array(

“https://domene1.no”,
“https://domene2.no”,
“https://domene3.no”,
“https://domene4.no”,
);
[/code]

Vil noe slikt som dette fungere, og gjøre jobben? Jeg er ikke stødig i curl, whatsoever:

<?php

$file = 'filen.php';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $urls.$file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
} else { echo 'ok'; }
curl_close ($ch);

?>

Hei,
Forstår jeg riktig at du har en cronjob for hver enkelt fil på hver enkelt domene slik det er i dag. Men ønsker å endre det til å ha en “master” fil og 1 cronjob til den hver dag og så tar “masterfilen” og foretar kjøring\kontroll av alle filene i arrayet?

Det er korrekt oppdattet! :slight_smile: Beklager forsøk på forklaring, dette er ikke min sterkeste side.

Da er du på rett spor :slight_smile:
Vanskelig å si noe mer uten å vite hva\hvordan noe kjøres fra mål-filene.

Se litt på curl_multi_init for async handing av flere mål.

2 Likes

På målfilene kjøres et enkelt PHP-script som fjerner noen filer på det aktuelle domenet (type opprydning av midlertidige filer som blir generert). Det ryddes opp, rett og slett fordi det genererer så sinnsyke mengder filer og størrelse.

$files = glob($newpath.'*'); // get all file names foreach($files as $file){ // iterate files if(is_file($file)) unlink($file); // delete file }

Takk for å ha dyttet meg i riktig retning!

Jeg endte opp med følgende, og det ser ut til at det virker ganske greit:

<?php
function get_data($url) {
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
  }

$sites = array(
    "https://qtmedia.no/test1.php",
    "https://conversionrate.no/test1.php",
    "https://dagensside.no/test1.php",
  );

foreach($sites as $site){
    $returned_content = get_data($site);
  }
?>

Har ikke PC med meg akkurat nå, men kan tenke meg at du kunne brukt et array ja og så gjort foreach se: https://stackoverflow.com/questions/54487993/get-email-from-json-array for en generell ide av hva jeg tenker. Du må modifisere det en god del, men med foreach så kjøres kodesnutten inne i foreachen en gang PR element i arrayet

1 Like

Well, du løste det mens jeg skrev. Tydelig at vi tenkte samme bane!

1 Like

Fikk noen telefoner. Supert det løste seg! Her var mitt forslag.

[CODE]<?php
$nodes = array(
“https://qtmedia.no/test1.php”,
“https://conversionrate.no/test1.php”,
“https://dagensside.no/test1.php”
);

$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10
);

$curl_arr = ;
$master = curl_multi_init();
foreach($nodes as $node) {
$url = $node;
$curl_arr[$node] = curl_init($url);
curl_setopt_array($curl_arr[$node], $options);
curl_multi_add_handle($master, $curl_arr[$node]);
}

do {
curl_multi_exec($master,$running);
} while($running > 0);
?>[/CODE]

Tror jeg ville lagt inn en form for validering i filene som kjøres om jeg skulle hatt det på min server, meen. Det det funker som du har gjort så :slight_smile:

1 Like

Takk for innspill!

Jeg har tatt det noen steg videre, og henter nå ut full liste fra serveren med domener, og slipper da å behandle arrayet med domener manuelt. Dette fungerer helt brillefint. Takk for hjelpa!

2 Likes

(to timers jobb sparer meg nå for sikkert 10 timer i året). Det er bare å finne flere slike tidstyver, og få driten automatisert.

1 Like

Kan jeg spoerre hva denne filen gjoer (siden du har den paa alle nettsider)? Bare nysgjerrig.

InfiniteWP tar backup av alle sidene, og lagret til dropbox. Men noen ganger feiler det, og da blir de liggende på webhotellet. Disse filene vil jeg da ha bort, for det blir noen GB i løpet av et år.

Ah ok :slight_smile: Smart loesning

[CODE]<?php

$urls = array(
“https://domene1.no”,
“https://domene2.no”,
“https://domene3.no”,
“https://domene4.no”
);

$file = ‘/filen.php’; // Legg til skråstrek foran filnavnet
$results = array(); // Array for å lagre resultater

foreach ($urls as $baseUrl) {
$fullUrl = $baseUrl . $file;

// Initialiser curl for hver request
$ch = curl_init();

// Sett curl-alternativer
curl_setopt($ch, CURLOPT_URL, $fullUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);        // Timeout etter 30 sekunder
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Hopp over SSL-verifisering hvis nødvendig

// Utfør request
$result = curl_exec($ch);

if (curl_errno($ch)) {
    $results[$baseUrl] = 'Error: ' . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($httpCode == 200) {
        $results[$baseUrl] = 'OK (200)';
    } else {
        $results[$baseUrl] = 'Error: HTTP code ' . $httpCode;
    }
}

curl_close($ch);

}

// Skriv ut resultater
foreach ($results as $url => $status) {
echo $url . ': ’ . $status . “\n”;
}

// Valgfritt: Logg resultater til fil
$logFile = ‘curl_log.txt’;
$logEntry = date(‘Y-m-d H:i:s’) . “\n”;
foreach ($results as $url => $status) {
$logEntry .= “$url: $status\n”;
}
$logEntry .= “------------------------\n”;
file_put_contents($logFile, $logEntry, FILE_APPEND);

?>[/CODE]