exec() werkt niet bij de ene provider maar wel bij de andere
Ik heb een scriptje wat planeetstanden uitrekent mbv een binary 'swetest', die heb ik zelf hier gebakken en werkt op m'n linux mint bak, werkte ook bij neostrada, maar ik wil naar vimexx en daar werkt het niet.
Ik heb ze gemaild of ze kunnen testen maar ze zeggen dat ik bij een programmeur moet zijn. :)
Ik heb even geen idee wat ik kan doen. Ik heb ze gevraagd of ze daar swetest op de cmdline willen testen voor me maar dat doen ze dus niet. En function_exists(exec) geeft wel true dus het zou moeten kunnen.
Ik heb er trouwens 2 versies van swetest staan, een 32 en een 64 bits, beide geven geen sjoege.
Wat kan ik doen?
Voor de vollledigheid, dit is de code, de regel met exec() staat in het midden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
$swephsrc = '/home/blabla/public_html/se/';
$sweph = '/home/blabla/public_html/se/';
unset($PATH,$out,$longitude,$speed);
$date_now = date ("Y-m-d");
$inmonth = strftime("%m", time());
$inday = strftime("%d", time());
$inyear = strftime("%Y", time());
$inhours = strftime("%H", time());
$inmins = strftime("%M", time());
$insecs = strftime("%S", time());
$intz = (strftime("%z", time()) / 100); //time zone on server
if ($intz >= 0)
{
$whole = floor($intz);
$fraction = $intz - floor($intz);
}
else
{
$whole = ceil($intz);
$fraction = $intz - ceil($intz);
}
$inhours = $inhours - $whole;
$inmins = $inmins - ($fraction * 100); //this was 60, but Adrián Argüelles noted an error when time zones like +10.30 were used
// adjust date and time for minus hour due to time zone taking the hour negative
$utdatenow = strftime("%d.%m.20%y", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear));
$utnow = strftime("%H:%M:%S", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear));
$transit_date_time = strftime("%d %B 20%y", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear)) . " at " . strftime("%H:%M", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear));;
putenv("PATH=$swephsrc");
// get 10 planets
exec ("swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789mD -eswe -fPls -g, -head", $out);
// Each line of output data from swetest is exploded into array $row, giving these elements:
// 0 = planet name
// 1 = longitude
// 2 = speed
foreach ($out as $key => $line)
{
$row = explode(',',$line);
$longitude[$key] = $row[1];
$speed[$key] = $row[2];
};
echo '<center><table><tr>';
for ($i = 0; $i < 12; $i++)
{
echo "<td nowrap><img src='http://jcremers.com/se/img/$i.gif'>" . ' ' . Convert_Longitude($longitude[$i]);
if ($speed[$i] < 0) echo "r";
}
echo '</table></center>';
function Convert_Longitude($longitude)
{
$sign_num = floor($longitude / 30);
$pos_in_sign = $longitude - ($sign_num * 30);
$deg = floor($pos_in_sign);
$full_min = ($pos_in_sign - $deg) * 60;
$min = floor($full_min);
$full_sec = round(($full_min - $min) * 60);
if ($deg < 10) { $deg = "0" . $deg; }
if ($min < 10) { $min = "0" . $min; }
if ($full_sec < 10) { $full_sec = "0" . $full_sec; }
//return $deg . " " . $signs[$sign_num] . " " . $min . "' " . $full_sec . chr(34);
$sign_num += 16;
$img = "<img src='http://jcremers.com/se/img/$sign_num.gif'>";
return $deg . " " . $min . "' " . $full_sec . chr(34) . " " . $img;
}
?>
$swephsrc = '/home/blabla/public_html/se/';
$sweph = '/home/blabla/public_html/se/';
unset($PATH,$out,$longitude,$speed);
$date_now = date ("Y-m-d");
$inmonth = strftime("%m", time());
$inday = strftime("%d", time());
$inyear = strftime("%Y", time());
$inhours = strftime("%H", time());
$inmins = strftime("%M", time());
$insecs = strftime("%S", time());
$intz = (strftime("%z", time()) / 100); //time zone on server
if ($intz >= 0)
{
$whole = floor($intz);
$fraction = $intz - floor($intz);
}
else
{
$whole = ceil($intz);
$fraction = $intz - ceil($intz);
}
$inhours = $inhours - $whole;
$inmins = $inmins - ($fraction * 100); //this was 60, but Adrián Argüelles noted an error when time zones like +10.30 were used
// adjust date and time for minus hour due to time zone taking the hour negative
$utdatenow = strftime("%d.%m.20%y", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear));
$utnow = strftime("%H:%M:%S", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear));
$transit_date_time = strftime("%d %B 20%y", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear)) . " at " . strftime("%H:%M", mktime($inhours, $inmins, $insecs, $inmonth, $inday, $inyear));;
putenv("PATH=$swephsrc");
// get 10 planets
exec ("swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789mD -eswe -fPls -g, -head", $out);
// Each line of output data from swetest is exploded into array $row, giving these elements:
// 0 = planet name
// 1 = longitude
// 2 = speed
foreach ($out as $key => $line)
{
$row = explode(',',$line);
$longitude[$key] = $row[1];
$speed[$key] = $row[2];
};
echo '<center><table><tr>';
for ($i = 0; $i < 12; $i++)
{
echo "<td nowrap><img src='http://jcremers.com/se/img/$i.gif'>" . ' ' . Convert_Longitude($longitude[$i]);
if ($speed[$i] < 0) echo "r";
}
echo '</table></center>';
function Convert_Longitude($longitude)
{
$sign_num = floor($longitude / 30);
$pos_in_sign = $longitude - ($sign_num * 30);
$deg = floor($pos_in_sign);
$full_min = ($pos_in_sign - $deg) * 60;
$min = floor($full_min);
$full_sec = round(($full_min - $min) * 60);
if ($deg < 10) { $deg = "0" . $deg; }
if ($min < 10) { $min = "0" . $min; }
if ($full_sec < 10) { $full_sec = "0" . $full_sec; }
//return $deg . " " . $signs[$sign_num] . " " . $min . "' " . $full_sec . chr(34);
$sign_num += 16;
$img = "<img src='http://jcremers.com/se/img/$sign_num.gif'>";
return $deg . " " . $min . "' " . $full_sec . chr(34) . " " . $img;
}
?>
Gewijzigd op 22/08/2021 13:37:13 door Jean Cremers
En wat is de uitvoer?
Execute bit is gezet?
En als je de stderr naar de stdout omleid ("2>&1" achter je commando), wat zit er dan in je $out?
https://jcremers.com
Toevoeging op 22/08/2021 10:17:28:
@Rob execute bit is gezet ja, geen toegang tot ssh, ik heb gevraagd of ze even op een cmdline wilden proberen maar dat houden ze af. Ik ga eens proberen met die redirect..
Toevoeging op 22/08/2021 10:21:57:
array(1) { [0]=> string(83) "./swetest: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ./swetest)"
De symbooltjes, gifjes, staan er allemaal prima maar allemaal met stand 0, de berekeningen zijn dus niet gedaan. Als je wil zien hoe het zou moeten kijk naar hoe het nu op neostrada uitziet, bovenin de site: Toevoeging op 22/08/2021 10:17:28:
@Rob execute bit is gezet ja, geen toegang tot ssh, ik heb gevraagd of ze even op een cmdline wilden proberen maar dat houden ze af. Ik ga eens proberen met die redirect..
Toevoeging op 22/08/2021 10:21:57:
array(1) { [0]=> string(83) "./swetest: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ./swetest)"
Gewijzigd op 22/08/2021 10:28:49 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# $Header$
# this Makefile creates a SwissEph library and a swetest sample on 64-bit
# Redhat Enterprise Linux RHEL 6.
# The mode marked as 'Linux' should also work with the GNU C compiler
# gcc on other systems.
# If you modify this makefile for another compiler, please
# let us know. We would like to add as many variations as possible.
# If you get warnings and error messages from your compiler, please
# let us know. We like to fix the source code so that it compiles
# free of warnings.
# send email to the Swiss Ephemeris mailing list.
#
CFLAGS = -g -Wall -fPIC # for Linux and other gcc systems
OP=$(CFLAGS)
CC=cc #for Linux
# compilation rule for general cases
.o :
$(CC) $(OP) -o $@ $? -lm
.c.o:
$(CC) -c $(OP) $<
SWEOBJ = swedate.o swehouse.o swejpl.o swemmoon.o swemplan.o sweph.o\
swephlib.o swecl.o swehel.o
swetest: swetest.o libswe.a
$(CC) $(OP) -o swetest swetest.o -L. -lswe -lm -ldl
swemini: swemini.o libswe.a
$(CC) $(OP) -o swemini swemini.o -L. -lswe -lm -ldl
# create an archive and a dynamic link libary fro SwissEph
# a user of this library will inlcude swephexp.h and link with -lswe
libswe.a: $(SWEOBJ)
ar r libswe.a $(SWEOBJ)
libswe.so: $(SWEOBJ)
$(CC) -shared -o libswe.so $(SWEOBJ)
clean:
rm -f *.o swetest libswe*
###
swecl.o: swejpl.h sweodef.h swephexp.h swedll.h sweph.h swephlib.h
sweclips.o: sweodef.h swephexp.h swedll.h
swedate.o: swephexp.h sweodef.h swedll.h
swehel.o: swephexp.h sweodef.h swedll.h
swehouse.o: swephexp.h sweodef.h swedll.h swephlib.h swehouse.h
swejpl.o: swephexp.h sweodef.h swedll.h sweph.h swejpl.h
swemini.o: swephexp.h sweodef.h swedll.h
swemmoon.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h
swemplan.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h swemptab.h
sweph.o: swejpl.h sweodef.h swephexp.h swedll.h sweph.h swephlib.h
swephlib.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h
swetest.o: swephexp.h sweodef.h swedll.h
# this Makefile creates a SwissEph library and a swetest sample on 64-bit
# Redhat Enterprise Linux RHEL 6.
# The mode marked as 'Linux' should also work with the GNU C compiler
# gcc on other systems.
# If you modify this makefile for another compiler, please
# let us know. We would like to add as many variations as possible.
# If you get warnings and error messages from your compiler, please
# let us know. We like to fix the source code so that it compiles
# free of warnings.
# send email to the Swiss Ephemeris mailing list.
#
CFLAGS = -g -Wall -fPIC # for Linux and other gcc systems
OP=$(CFLAGS)
CC=cc #for Linux
# compilation rule for general cases
.o :
$(CC) $(OP) -o $@ $? -lm
.c.o:
$(CC) -c $(OP) $<
SWEOBJ = swedate.o swehouse.o swejpl.o swemmoon.o swemplan.o sweph.o\
swephlib.o swecl.o swehel.o
swetest: swetest.o libswe.a
$(CC) $(OP) -o swetest swetest.o -L. -lswe -lm -ldl
swemini: swemini.o libswe.a
$(CC) $(OP) -o swemini swemini.o -L. -lswe -lm -ldl
# create an archive and a dynamic link libary fro SwissEph
# a user of this library will inlcude swephexp.h and link with -lswe
libswe.a: $(SWEOBJ)
ar r libswe.a $(SWEOBJ)
libswe.so: $(SWEOBJ)
$(CC) -shared -o libswe.so $(SWEOBJ)
clean:
rm -f *.o swetest libswe*
###
swecl.o: swejpl.h sweodef.h swephexp.h swedll.h sweph.h swephlib.h
sweclips.o: sweodef.h swephexp.h swedll.h
swedate.o: swephexp.h sweodef.h swedll.h
swehel.o: swephexp.h sweodef.h swedll.h
swehouse.o: swephexp.h sweodef.h swedll.h swephlib.h swehouse.h
swejpl.o: swephexp.h sweodef.h swedll.h sweph.h swejpl.h
swemini.o: swephexp.h sweodef.h swedll.h
swemmoon.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h
swemplan.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h swemptab.h
sweph.o: swejpl.h sweodef.h swephexp.h swedll.h sweph.h swephlib.h
swephlib.o: swephexp.h sweodef.h swedll.h sweph.h swephlib.h
swetest.o: swephexp.h sweodef.h swedll.h
Toevoeging op 22/08/2021 10:43:39:
Kunnen jullie waarschijnlijk ook niet veel mee, ik heb de vraag gesteld op het forum van de swiss ephemeris waar deze code vandaan komt, ik laat nog weten wat eruit komt.
Je hebt geen VPS, begrijp ik?
Voorlopig zit het er dus gewoon niet in, als ik nog verder kom laat ik het horen.
Toevoeging op 22/08/2021 12:22:44:
Zo, ik ben even mooi geholpen daar, ik kreeg wat aanpassingen aan de makefile zodat die zonder dependancies compileert, heb de binary aan de praat. Krijg planeetstanden alleen wel nog een warning, die ta maken heeft met het pad waardoor niet de optimale methode wordt gebruikt.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$swephsrc = '/domains/blabla/public_html/se/';
$sweph = '/domains/blabla/public_html/se/';
unset($PATH,$out,$longitude,$speed);
putenv("PATH=$swephsrc");
// get 10 planets
exec ("./swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789mD -eswe -fPls -g, -head 2>&1", $out);
$sweph = '/domains/blabla/public_html/se/';
unset($PATH,$out,$longitude,$speed);
putenv("PATH=$swephsrc");
// get 10 planets
exec ("./swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789mD -eswe -fPls -g, -head 2>&1", $out);
En dat geeft behalve de output deze warning nog, die is niet fataal want als die bestanden niet gevonden worden wordt naar een andere methode omgschakeld die echter minder kan.
Dus op de een of andere manier zet ik PATH niet goed?
Code (php)
1
[4]=> string(40) "error: SwissEph file 'seas_18.se1' not found in PATH '/domains/blabla/public_html/se/'" [12]=> string(39) "Chiron , 0.0000000, 0.0000000" [13]=> string(0) "" [14]=> string(118) "warning: SwissEph file 'sepl_18.se1' not found in PATH '/domains/blabla/public_html/se/'" [15]=> string(19) "using Moshier eph.;" }
Toevoeging op 22/08/2021 12:47:42:
Ook opgelost door als path gewoon ./ te geven.
Nou dan ben ik hier uit! Hartelijk bedankt voor de hulp.
Toevoeging op 22/08/2021 12:55:28:
Toch nog niet helemaal. Als ik naar public_html/se browse, waar de index.php en de binary staat krijg ik mooi resultaat maar als ik vanuit de hoofdmap in index.php die code wil aanroepen met
include include('se/index.php');
krijg ik
"sh: ./swetest: Permission denied"
Toevoeging op 22/08/2021 12:58:56:
Ik denk dat het komt vanwege ./ als PATH
Gewijzigd op 22/08/2021 12:24:04 door Jean Cremers
Permission denied. Komt dat niet door je rechten, die niet op executable staan?
Toevoeging op 22/08/2021 13:08:49:
Als ik de code vanuit het forum aanroep met include ../se/index.php krijg ik weer dit
"sh: ./swetest: No such file or directory"
Gewijzigd op 22/08/2021 13:09:19 door Jean Cremers
Kan je dan niet in exec() /bin/swetest met de nodige parameters erachter, uitvoeren?
Ik moet ook een path zetten omdat de binary ook weer bestanden raadpleegt met ephemeriden, dus ik ben bang dat dat niet werkt, ik zal het nog eens proberen.
Toevoeging op 22/08/2021 13:25:58:
sorry, swetest gebruikt al parameters, waaronder dus die paden:
$sweph = './';
exec ("./swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789mD -eswe -fPls -g, -head", $out);
Toevoeging op 22/08/2021 13:31:53:
en bovendien moeten die bestanden in het pad staan dus ook:
$swephsrc = './';
putenv("PATH=$swephsrc");
Leuke puzzel :) Maar ik heb het in ieder geval aan de praat, al is het in de root, ach..
als je ./ zou vervangen naar bijvoorbeeld /se dan zou het toch ook moeten werken in de se map? of enkel / gebruiken?
@Ray, is me niet gelukt, ik vind het best zoals het nu werkt.