Napisał do mnie użytkownik:
Panie Wojtku czy LottoCada można zaktualizować nowszej wersji PHP ?
Odpisałem :
Niestety nie można. Użyty komponent nie jest już odświeżany do nowszych wersji. Sam ubolewam nad tym. Od wersji 5.26 komponent ten jest martwy. Trzeba korzystać na zewnątrz np w świetnym środowisku VSCode eksportując np losowania jako pliki tekstowe lub pobierając je z serwera. Można teżchyba choć nie próbowałem korzystać z nowszych wersji w sposób hybrydowy tzn z wersji starej wywoływać wersję nową i pobierać wynik powrotny.
Nie próbowałem ale nie wytrzymałem i spróbowałem. I w ten sposób zrobiłem tą próbę pisząc skrypt pośredniczący w wysyłaniu danych z programu LottoCAD i odbierający wyniki ze skryptu wykonanego w zainstalowanym w systemie nowszym interpreterze PHP:
<?php
/*
W programie LottoCAD jest wbudowany interpreter skryptow PHP w wersji max 5.2.6.
Wymusza to komponent autorstwa Pana Sergheya Pervoznika Delphi4PHP , ktory obsluguje tylko wersje PHP max 5.2.6
Czasami jednak potrzebne są funkcje dostepne tylko w nowszych wersjach PHP (np. 7.x lub 8.x).
Dla przykladu biblioteka do obslugi notowan na gieldach papierow wartosciowych wymaga PHP 7.2 lub nowszego.
Potrzebny jest wiec sposob na uruchomienie skryptu PHP w nowszej wersji PHP z poziomu starszej wersji PHP.
Wysyłamy zatem do nowszej wersji PHP ciag JSON z danymi, a nastepnie odbieramy wynik.
Ten skrypt uruchamia okreslony plik PHP w najnowszej wersji PHP z ciagiem JSON jako wejsciem.
W nowych wersjach mozna budowac skrypty PHP korzystajac z funkcji dostepnych w nowszych wersjach PHP,
i odbierac ich wyniki i drukowac w programie LottoCad lub na stronach www.
W analogiczny sposob mozna uruchamiac skrypty w Pythonie z jeszcze bogatszym repertuarem funkcji.
Sposob uzycia w Pythonie: "python run_new_python.py ciag_json"
Ten Skrypt dziala z wersja PHP max 5.26 a wywoluje inny PHP w najnowszej wersji zainstalowanej w systemie.
Uzycie: "php run_new_php.php ciag_json" powinien byc poprawnym ciagiem JSON.
w PHP, plik JSON jest zapisywany tymczasowo jako 'input.json' i przekazywany do skryptu PHP.
Jak utworzyc w php ciag JSON przyklad:
$data = array("key1" => "value1", "key2" => "value2");
$jsonString = json_encode($data);
Nastepnie przekaz $jsonString jako drugi argument do tego skryptu.
*/
// Budujemy ciag JSON do przekazania do PHP
$draw = delphi_get_draw_arr(); // pobiera wszystkie losowania z aplikacji LottoCAD
$draw = array_reverse($draw, false); // odwraca tablice, ostatnie losowania sa pierwsze
$limit = 200; // limit losowan przekazywanych
$draw = array_slice($draw,0,$limit); // obcinamy do limitu
// $mainedit to zmienna wbudowana w aplikacje LottoCAD
// zawierajaca glowne pole edycji losowan
// budujemy parametr do przekazania w postaci ciagu znakow
$jsonString = '{"draw":'.json_encode($draw).',"mainedit":"'.$mainedit.'"}';
// Zapisz ciag JSON do pliku tymczasowego
$inputFile = 'C:\Users\wojte\Documents\projekty_lc_php\input.json';
// Polecenie zapisuje ciag JSON do pliku tymczasowego
file_put_contents($inputFile, $jsonString);
$newPhpExecutablePath = 'C:\PHP837\php.exe'; // pelna sciezka do nowej wersji PHP
// Sciezka do pliku PHP do uruchomienia w nowej wersji PHP
$phpFilePath = 'C:\Users\wojte\Documents\projekty_lc_php\check_php_version.php';
// --- Budowanie polecenia (wersja inteligentna) ---
// Otaczamy sciezke do pliku wykonywalnego cudzyslowami tylko wtedy,
// gdy zawiera ona spacje. To najbardziej niezawodna metoda.
$executable = $newPhpExecutablePath;
if (strpos($executable, ' ') !== false) {
$executable = '"' . $executable . '"';
}
// Zbuduj polecenie do wykonania
// Dodanie '2>&1' na koncu polecenia powoduje, że bledy (stderr)
// zostana rowniez przechwycone i zwrocone w zmiennej $output.
// Argumenty skryptu zawsze zabezpieczamy za pomoca escapeshellarg()
$command = $executable . ' ' . escapeshellarg($phpFilePath) . ' ' . escapeshellarg($inputFile) . ' 2>&1';
// Wykonaj polecenie w nowej wersji PHP
$output = shell_exec($command);
// Wyswietl wynik (w tym ewentualne bledy)
echo $output;
// Opcjonalnie: usun plik tymczasowy po uzyciu
// unlink($inputFile);
?>
Brak komentarzy:
Prześlij komentarz