在从Web调用的PHP代码中,此代码未运行。但它通常在CLI上运行。 sh文件的chmod是777。
$c = shell_exec('printf "{$res}" | ./new-openvpn-client.sh {$user}');
答案 0 :(得分:0)
如另一个答案中所述,单引号字符串不会解析变量,因此您需要使用双引号。但是,您还需要确保正确引用和清除了外部命令的参数。 Use escapeshellarg()
for that.
float cross(Vec2f const &edge1, Vec2f const &edge2)
{
return edge1[0] * edge2[1] - edge1[1] * edge2[0];
}
bool caculateBarycentricWeights(float invDoubleTriArea, float doubleTriArea, Vec2f const (&edgesFromTo01_12_20)[3], Vec2f const (&vertex)[3], Vec2f const &point, float(&outWeight)[3])
{
outWeight[0] = cross(point - vertex[2], edgesFromTo01_12_20[1]);
outWeight[1] = cross(point - vertex[0], edgesFromTo01_12_20[2]);
outWeight[2] = cross(point - vertex[1], edgesFromTo01_12_20[0]);
if (outWeight[0] >= 0.0f && outWeight[1] >= 0.0f && outWeight[2] >= 0.0f
&& outWeight[0] + outWeight[1] + outWeight[2] <= doubleTriArea * 1.000001f)
{
outWeight[0] *= invDoubleTriArea;
outWeight[1] *= invDoubleTriArea;
outWeight[2] *= invDoubleTriArea;
return true;
}
else
{
return false;
}
}
void rasterize(Vec3f const &vertex0, Vec3f const &vertex1, Vec3f const &vertex2, vector<Vec3f> &dstBuffer)
{
Vec2f const edgesFromTo01_12_20[3] =
{
Vec2f(vertex1[0] - vertex0[0], vertex1[1] - vertex0[1]),
Vec2f(vertex2[0] - vertex1[0], vertex2[1] - vertex1[1]),
Vec2f(vertex0[0] - vertex2[0], vertex0[1] - vertex2[1])
};
//in viewport space up and down is switched, thats why '-'
float const doubleTriangleArea = -cross(edgesFromTo01_12_20[0], edgesFromTo01_12_20[1]);
float const invDoubleTriangleArea = 1.0f / doubleTriangleArea;
float weight[3];
float invZ[3] = { 1.0f / vertex0[2], 1.0f / vertex1[2], 1.0f / vertex2[2] };
Vec2f p(vertex0[0], vertex0[1]);
Vec2f vPos[3] = {
Vec2f(vertex0[0], vertex0[1]),
Vec2f(vertex1[0], vertex1[1]),
Vec2f(vertex2[0], vertex2[1])
};
const size_t RES_X = 1024;
const size_t RES_Y = 768;
for (size_t y = 0; y < RES_Y; ++y)
{
p[1] = y;
for (size_t x = 0; x < RES_X; ++x)
{
p[0] = x;
if (caculateBarycentricWeights(invDoubleTriangleArea, doubleTriangleArea, edgesFromTo01_12_20, vPos, p, weight))
{
//interpolate values
float z = 1.0f / (weight[0] * invZ[0] + weight[1] * invZ[1] + weight[2] * invZ[2]);
dstBuffer[y * RES_X + x] = ((vertex0 * (weight[0] * invZ[0])) + (vertex1 * (weight[1] * invZ[1])) + (vertex2 * (weight[2] * invZ[2]))) * z;
}
}
}
}
int main(int argc, char *argv[])
{
vector<Vec3f> buffer;
buffer.resize(1024 * 768);
high_resolution_clock::time_point start = high_resolution_clock::now();
size_t fps = 0;
while (true)
{
static Vec3f v0 = { -2000.0f, -2000.0, 10.0 };
static Vec3f v1 = { 2000.0f, -2000.0, 10.0 };
static Vec3f v2 = { 0.0f, 2000.0, 10.0 };
rasterize(v0, v2, v1, buffer);
++fps;
high_resolution_clock::time_point now = high_resolution_clock::now();
auto timeDiff = duration_cast<microseconds>(now - start).count();
static const long oneSecond = 1000000;
if (timeDiff >= oneSecond)
{
cout << fps << " ";
fps = 0;
start = now;
}
}
return 0;
}
$res = escapeshellarg($res);
$user = escapeshellarg($user);
$c = shell_exec("printf $res | ./new-openvpn-client.sh $user");
不太可能正确解决。将脚本放在./new-openvpn-client.sh
之类的合理位置,并在命令中提供完整路径。
答案 1 :(得分:0)
这是应用程序可执行文件的权限问题。我已经通过给予apache用户真正的权限来解决。