Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Jak uruchomić skrypt z poziomu CLI
Forum PHP.pl > Forum > Przedszkole
Malinaa
Jak uruchomić skrypt PHP z poziomu CLI na localhost (i serwer zdalny), system Windows (a Linux)?
nospor
nie bardzo rozumiem pytania. no ale generalni to sie robic tak:

php nazwaskryptu.php
Malinaa
Pytam w odniesieniu do mojego frameworka.
Jeżeli umieszczę w katalogu głównym plik np. sync.php: <?php echo 'PIP'; ?>
Jest ok, wpiszę w terminalu php sync.php i wyświetli PIP.

Ale mam tu "oddzielone warstwy" aplikacji, htaccess itd. i brak pliku z rozszerzeniem sync.php, nawet index.php znajduje się w katalogu public/ nie głównym, a przykładowy adresy do strony to: /show-me i wpisanie php show-me nie zadziała,
a strona (teoretycznie plik.php) jest pod danym adresem.

Nie mam tu bezpośrednie pliku (sync.php). Pytanie jak, czy można uruchomić kod pod adresem strony /show-me ?
nospor
Po pierwsze: mylisz dwie rzeczy - skrypt php i strona . To ze strona odpala skrypt php to inna bajka.
po drugie: do odpalania strony uzywa sie CURL - przynahmniej na linux, ale na windzie pewnie jest cos podobnego

po trzecie i najwazniejsze: Moze opisz wpierw caly kontekst czemu chcesz odpalac strone z konsoli. Bo moze sie okazac ze nie jest to ci w ogole potrzebne i wystarczy jednak dopisac mala funkcjonalnosc w twoim FW i odpalac poprostu skrypt php
Malinaa
Pierwsze i drugie, jak już spróbowałem teraz stało się zrozumiałe.
Trzecie. Synchronizacja produktów Baselinker ze sklepem ma być odpalana z poziomu webowego i poziomu CLI.

1. Jeżeli mam odpalić po prostu skrypt.php to jaką małą funkcjonalność muszę dodać?
2. Gdzie powinien być umieszczony plik w strukturze katalogów FW?
3. Jak to zrobić, aby zachować przy tym bezpieczeństwo?
nospor
Na szybko to tak jak pisalem:

curl http://twojaststrona.pl/akcja

Ale takich rzeczy powinno sie unikac. Normalnie FWs udostepniaja jeszcze takie cos jak COMMANDS, ktore sluzy do odpalania skryptow z poziomu wlasnie cli. FW ustawia wowczas wszystkie parametry tak jakby to szlo przez strone, zmienne srodowiskowe, serwisy itp
Drugim krokiem jest wlasnie napisane serwisu w twojej aplikacji. Ten serwis robi co ma robic, czyli w tym przypadku laczyc sie z baselinkerem. No i generalnie wowczaas niewazne czy serwis odpalisz z akcji ze strony www, czy z COMMAND z cli. Klasa serwisu jest jedna i latwo moze byc wykorzystana z dowolnego miejsca
Malinaa
Z COMMANDS to pewnie nie będzie taka mała funkcjonalność.
Znasz może przykłady (gotowce) co jak, o co dokładnie chodzi?
nospor
symfony ma CONSOLE

ale generalnie zamysl jest banalny, pol godzinki i sam napiszesz.

Walisz jakis plik php console.php, w ktorym ladowane sa wszystkei podstawowe parametry FW/zmiennej srodowiskowe,biblioteki/serwisy. Tak jak ladujesz gdy odpalasz akcje przez www.
no i odpalasz z cli tak:
php console.php jakasakcja

no i w jakims tam katalogu, powiedzmy Commands, tworzysz plik jakasakcja.php ktory zawiera kod wykonujacy dana akcje/komende. Cos ala kontroler.

wiec plik console.php laduje wszystko co trzeba a potem includuje ten jakasakcja.php/ Proste
Malinaa
Rzeczywiście pól godziny i napisane, pojawia się jednak więcej pytań.

Plik dodany do projektu: https://github.com/artimman/dbmframework/bl...ain/console.php

Otwieram aplikacje w katalogu głównym, tu też mam otworzony terminal, więc plik umieszczam w głównym katalogu console.php
Nie widziałem podobnego rozwiązania, aby umieszczać Commands (plik console.php) w katalogu głównym?
Teoretycznie jest nie źle, po wpisaniu adresu w pasku przeglądarki /console.php wyświetla ERROR: 404; Message: Route not found! addRoute('/console.php')
czyli nie widzi tego pliku z przeglądarki (plik jest jakoś zabezpieczony), ale w terminalu komendy wykonuje, więc już jest nie źle.
1. Czy ten plik console.php ma tak zostać w katalogu głównym, a jakieś zabezpieczenia?

Dodałem includes
Kod
### CONSOLE COMMANDS
include(__DIR__ . DIRECTORY_SEPARATOR . 'commands' . DIRECTORY_SEPARATOR . 'action_show_me_code.php');
include(__DIR__ . DIRECTORY_SEPARATOR . 'commands' . DIRECTORY_SEPARATOR . 'action_show_me_text.php');

// INFO! Wywolanie kody pliku actionShowMeCode.php w konsoli
// $ php console.php [file_name] // Pytanie: Wykonuje wszystkie includowane pliki, a pojedynczo?

Wpisuje w terminalu: php console.php - OK, ale bez różnicy czy php console.php action_show_me_code czy cokolwiek innego wykona to samo (wszystko)?

2. Wykonuje wszystkie includowane pliki, a pojedynczo?
3. Przy synchronizacji całość powinna być dobrze zabezpieczona, co z plikami w katalogu /commans/action_show_me_code.php itd., co z bezpieczeństwem kodu, danych?

W aplikacji pozostał taki kod:
// TODO! Remove the definition from the entire project
define('DS', DIRECTORY_SEPARATOR);
define('BASE_DIRECTORY', __DIR__ . DS);

viking napisał, aby pozbyć się takich potworków, usunąć poprzedni plik config.php.dist i przerobić na .env.
Plik config.php przerobiłem na .env, ale pozostały jeszcze takie dwa potworki w pliku public/index.php, nie za bardzo da się przenieść je do .env
4. Szukam pomysłu jak to sprawnie poprawić, gdy te define() są używane w całej aplikacji?
nospor
1) console.php ma byc poza katalogiem PUBLIC. I tyle. moze byc glowny, moze byc inny, jak ci wygodnie, byleby byl poza PUBLIC
2) Nie rozumem pytania. Nie meniej jednak w kodzie widze teraz ze includujesz od razu wszystkie commands. Nie, masz includowac tylko te command, o ktora prosisz wywolujac console.php. No po grzyba masz ladowac wszystko
Kolejna rzecz command to ma byc klasa a nie zwykly plik php. I klasa ta ma miec funkcje np. execute ktora bedzie odpalana przez console.php
3) znowy nie rozumiem. Jaka synchronizacja?
Malinaa
Jeżeli console.php może być w dowolnym katalogu poza /public to dałem do /application
https://github.com/artimman/dbmframework/bl...ion/console.php
Command zmienione na klasę.

Nie wiem co z php console.php jakasakcja - co z jakasakcja, ponieważ czy wpiszę komendę php console.php, czy php console.php jakasakcja wykona to samo $command->executeCommand();

Synchronizacja produktów Baselinker ze sklepem. Plik console.php generalnie jest już zabezpieczony (nie dostępny publicznie), ale przyszło mi na myśl, czy taki mechanizm nie powinien być lepiej, dodatkowo zabezpieczony w jakiś sposób, ponieważ przesyłane są tu dane poufne (ceny itp.) i nie chcielibyśmy, aby ktoś z zewnątrz pobrał te dane. Jakie są odpowiednie zabezpieczenia dla takiej synchronizacji kodu, danych?
nospor
Cytat
Nie wiem co z php console.php jakasakcja - co z jakasakcja, ponieważ czy wpiszę komendę php console.php, czy php console.php jakasakcja wykona to samo $command->executeCommand();

Czasami jak wylaczysz myslenie to ja nie wiem jak z toba rozmawiac...

Przeciez w console.php teraz masz
$command = new ExampleCommand();
$command->executeCommand();

czyli za kazdym razem odpalasz te komende nie wazne jakie parametry przyjmie console.php. No to logiczne ze zawsze ci sie bedzie odpalac.
A ja wyraznie mowilem, ze console.php ma odpalac te command, ktora podales jako parametr

Co do synchronizacji to jesli commands sa poza katalogiem public to sa bezpieczne. No chyba ze ktos ci sie wlamie na konto ale to wtedy niewazne co to i tak klapa
Malinaa
wink.gif Odznaczam // $command->executeCommand(); bo tego nie chcemy i zostało $command = new ExampleCommand();

No i nie wiedziałem jak sprawić, aby wykonało się: php console.php ExampleCommand executeCommand
ale dodałem __construct() i wygląda, że jest całość Ok.

Czyli poza włamywaczami jest na sto procent bezpiecznie. Super.
nospor
No nadal zle. Nie sluchasz co do ciebie mowie.

console.php ma nie odpalac recznie rzadnej komendy. No ty tereaz w console wlozyles odpalanie ExampleCommand. Console tego ne robi. A co jak bedzeisz chcial dodac kolekna komende? I kolejna i 100 kolejnych?

Skup sie:
console ma includoac komende podane w parametrze wywolania

php console.php Example

a w konsole php pobierasz ten parametr

$command = argv[1]; // czy pod jakim to arguiement bedzie

require_once('path_to_commands/' . $command . "Command.php");

$class = $command . "Command";
$obj = new $class;
$obj->execute();

I juz
Malinaa
Teraz powinno być Ok. Chyba, że coś jeszcze jest do poprawienia?
nospor
Jest lepiej ale:

1) Juz ci mowilem ze Commands moze byc wiecej wiec nadawaj im nazwy tego co robia a nie ConsoleCommand.. Jesli bedzies robil synchronizera, to nazwij to SynchroniseCommand czy jakos tak

2) Ale po co w parametrach console.php jeszcze nazwa funkcje klasy Command? Klasa ma miec jedna stala metode execute() i ona ma byc zawsze odpalana jako glowna metoda Command i juz. A nie execute1, execute2, execute3. Jedna klasa - jedna komenda. Bedziesz chcial inna komende to napisze inna kolejna klase command.

3) No i najlepiej stworz interface CommandInterface, z metoda execute i wszystkie klasy Command maja implementowac ten interface
Malinaa
Napisałem tak jak mówiłeś, nie bawiąc się metodami itp., bo przez to dochodzenie do szczegółów z pół godzinki zrobiło się 3x po godzinie, a miało być tak pięknie raz dwa i gotowiec wink.gif
Dziękuje bardzo. Teraz chyba jest już super Git?
nospor
Cytat
bo przez to dochodzenie do szczegółów z pół godzinki zrobiło się 3x po godzinie

Tak to jest jak nei sluchasz co do ciebie pisze wink.gif

teraz wyglada znosnie smile.gif
Malinaa
Jak to znośnie!?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.