No dobra, przynajmniej trochę wiem o co Ci chodzi.
Ale Ty to chcesz mieć tylko u siebie na swoim kompie? To znaczy lokalnie odpalić PHP i przeglądarke?
Czy chcesz mieć PHP na jednym kompie, a klienta z przeglądarką i JSem na drugim?
Odpale u siebie lokalnie w przeglądarce na kompie, ale skrypt będzie się wykonywał na VPS, bo tam czyta ten plik .txt
Czyli chcesz odpalić PHP zdalnie, a u siebie lokalnie odpalić tylko przeglądarkę.
Ehh, czemuś tego od początku nie powiedział, klasyczny problem XY.
No to to co musisz zrobić:
- Aplikacja w PHP musi co jakiś czas otwierać Twój plik
.txt
(albo mieć go otwartego w trybie r
, read) i szukać zmian.
- Musi powstać jakiś kanał komunikacji PHP z Twoją przeglądarką:
- Możesz to zrobić tak że co jakiś czas Twoja apka w JS strzela do PHP
- Możesz ustawić websockety tak żeby to PHP strzelił z powrotem do klienta
- Dowolny inny
- Nie żadna "pętla" w JS, tylko po prostu kiedy dostaniesz info od PHP że coś się zmieniło odpalasz dźwięk.
Swoją drogą gratulację, przez to że nie napisałeś od razu co chcesz zrobić, zmarnowałeś trzem osobom które próbowały Ci pomóc pół dnia.
Ale teraz co do samego problemu: sądząc po jakości Twojego kodu, websockety odpadają.
Zrób dwa pliki: index.html
oraz check.php
:
index.html
- krótki kawałek JavaScript, który co 10 sekund zrobi żądanie pod check.php
, załaduje dane w formacie JSON, i jeśli odpowiedź to jest success
to zagra dźwięk:
<html>
<body>
function start() {
setTimeout(() => performCheck(start), 10 * 1000);
}
function performCheck(done) {
fetchCheck(response => {
if (response.success) {
playSound();
}
done();
}, done);
}
function fetchCheck(onSuccess, onError) {
fetch("/check.php")
.then(response => response.json())
.then(onSuccess)
.catch(() => {
console.log("Problem z załadowaniem zasobu");
onError();
});
}
function playSound() {
new Audio('jest.wav').play();
}
</body>
</html>
check.php
- krótki plik PHP, który spróbuje ponownie wczytać jakiś plik, i sprawdzi czy doszły w nim zmiany, od ostatniego requesta. Żeby to zrobić "w pętli", tak jak pisałeś wcześniej, musiałbyś podpiąć websockety (albo próbować to inaczej obejśc, jakieś prehistoryczne sposoby jak long-poll, albo comet), ale do tego raczej Ci brakuje umiejętności na razie. Więc to co musisz zrobić to jakoś na serverze przetrzymać informacje o poprzednim sprawdzeniu Twoich danych, i użyć je do podownego sprawdzenia. Np w pliku albo w sesji, albo ewentualnie w cookie.
<?php
function countWordsInFile(string $filename, string $word): int {
$content = \file_get_contents($filename);
return \substr_count($content, $word);
}
$previousWordsCount = ; // tutaj je sobie odczytaj skąś poprzednie "policzenie słów"
$currentWordCount = countWordsInFile('file.txt', 'some word');
$success = $currentWordCount > $previousWordsCount; // Jeśli nowych jest więcej niż starych - zwróć success=true
// tutaj sobie gdzieś zapisz, ile Tych słów jest, w pliku, w sesji, gdzie chcesz
echo \json_encode(['success' => $success]);