[PHP] Aggiungere un mio script a prestashop?

Phelps

Nuovo Utente
17 Dic 2018
46
0
6
Spiego..
Ho integrato un plug che crea due url di soncronizzazione con una piattaforma esterna. Un link sincronizza i prodotti e l'altro gli ordini.
Il plug in dice di creare delle attivita di cron nel task del webhost che richiamano l'url ogni 30 minuti.
Aruba mi fa inserire un task solo con un solo url.
Loro dicono questo:
"potrebbe provare a richiamare tramite php le due url con in mezzo uno sleep di qualche secondo in questo caso richiamerebbe una sola pagina php"

mi chiedo è possibile infilare questo script in prestashop e raggiungerlo con un url? in tal caso come dovrei scriverlo?
 

macus_adi

Utente Attivo
5 Dic 2017
1.128
64
48
IT/SW
Banalmente allora gestisci a coda il tutto...
Ossia, fai un task che lo richiami ogni minuto, e nel db memorizzi la coda di elaborazione...

Struttura logico/funzionale:
DB - cron
id ~ call ~ is_enable ~ created_at
id: Autoincrement
call: String
is_enable: Bool default 1
created_at: Datetime
call_at:Datetime

Ogni minuto chiami lo script che gestisce il cron,
  1. ti tuffi nella tabella "cron"
  2. recuperi le attività che sono nello stato is_enable=1
  3. esegui la funzione/metodo memorizzato in "call"
  4. alla fine aggiorni il dato della riga is_enable=0 e call_at=Datetime
Tutto qui hai fatto lo scheduler con granulosità di 1 minuto!

Per ampliare lo script basterebbe gestire quando è possibile attivare quel task..:!
 
Ultima modifica:

Phelps

Nuovo Utente
17 Dic 2018
46
0
6
ma è dove tu hai scritto string che dovrebbero essere incollate le due url?

Ma a me sembra piuttosto di capire questo:
tipo di creare un file cosi: file.php e piazzarlo nella directory del sito in modo cha sia raggiungibile, miosito.it/file.php
questo file all interno dovrebbe avere una funzione che che ritorna le due url letterali.
Cosa intende il tipo di aruba con lo sleep in mezzo?? capisco che è il ritardo...

.........ad ogni modo dove dovrei mettere il file in prestashop?
 
Ultima modifica:

Phelps

Nuovo Utente
17 Dic 2018
46
0
6
mi dispiace ma non ho capito.. la tabella cron è in prestashop?

Codice:
DB - cron
id ~ call ~ is_enable ~ created_at
id: Autoincrement
call: String
is_enable: Bool default 1
created_at: Datetime
call_at:Datetime
questo qui sù è lo script?

sapresti spiegarmi la questione di usare la funzione sleep suggerita dal tizio?
 
Ultima modifica:

Phelps

Nuovo Utente
17 Dic 2018
46
0
6
ho capito ma io sono uno sviluppatore frontend js:( nonsql...
Con php e mysql mi barcameno sulle normali operazioni di crud..
Code e task non sò cosa siano.

Tu puoi provvedermi una soluzione piu dettagliata?
altrimenti dico che non lò sò fare e buonanotte.
 

macus_adi

Utente Attivo
5 Dic 2017
1.128
64
48
IT/SW
Buongiorno @Phelps , ti spiego cosa fare e veramente sono solo 2 semplici operazioni:

1: Crea una tabella sul DB (potresti utilizzare anche un file csv,yaml etc...) con:
  • ID -> integer autoincrement
  • call -> varchar(255) //questa è la funzione che dovrai richiamare
  • is_enable -> bool default 1
  • created_at -> datetime
  • available_at -> datetime
In in "call" devi memorizzare il metodo di una classe e/o una funzione che vuoi eseguire, in available_at metti la data e l'orario di quando è possibile effettuare il lavoro (job) messo in coda (queue).

Ipotizziamo di avere una classe "Worker.php" e di voler avviare il Task:
cron style: */1 * * * * php /directory/applicazione/Werker.php

Cosa significa? Abbiamo avviato un Task che parte ogni minuto.

Immaginiamo di avere 2 metodi all'interno di Worker.php
PHP:
public $data=[];
public $limit=10;
public $conn;

public $current_index=0;

/**
*Costruttore
*/
public function __constructor(){
   $this->conn=new Connection(); //imposta la tua connessione con la lib che ti piace
   $this->getData();
}
/**
* Ottiene le chiamate da effettuare
*/
public function getData(){
    $this->data=$this->conn->query('SELECT BLA BLA BLA FROM TABLE WHERE BLA = BLABLA LIMIT '.$this->limit);
    return $this;
}
/**
* Aggiorna lo stato di un Job
*/
public function updateJob(){
     $this->conn->query('AGGIORNA I DATI WORKER PER DISATTIVARLO WHERE id = '.$this->data[$this->current_index]['id']);
 
}
/**
* Ping su di una pagina (esempio)
*/
public function pingPage(){
    //file_get_contents solo per semplicità
    file_get_contents('https://pagina');
}
/**
* Invia parametri (esempio)
*/
public function sendParams(){
}
Ora immagina che getData abbia estratto una riga del genere:
id=1
call=pingPage
is_enable=1
created_at=2019-10-15 09:00:00
available_at=2019-10-17 09:15:00

Quindi sappiamo che dobbiamo chiamare il metodo pingPage il 17 Ottobre 2019 alle ore 9:15 di mattina.
Alla fine della classe dobbiamo richiamare questi metodi in questo modo:
PHP:
//Inizializzo la classe che automaticamente recupererà i dati dal BD
$worker=new Worker();
//Inizio a ciclare i dati estratti
//ipotizzo estrazione ad array
foreach($worker->data as $chiave=>$valore){
     //controllo se il metodo esiste all'interno della classe
    if(method_exists($worker,$valore['call'])){
          //var appoggio
          $worker->current_index=$k;
           //chiamo il metodo della classe memorizzato in call
          call_user_func([$worker,$valore['call']]);
           //aggiorno il worker per renderlo disattivo
           $worker->updateJob();
   }
}
Sembra complicato, invece è veramente una cavolata...

Naturalmente non ho gestito il available_at in quanto dovresti farlo da query, per recuperare le risorse in :
is_enable = 1 AND available_at = TUA CONDIZIONE
 
Ultima modifica:

Phelps

Nuovo Utente
17 Dic 2018
46
0
6
grazie..con l 'esempio pratico è tutto molto piu chiaro.
stasera che torno a casa, lo guardo per bene..
Grazie.;)