Php 关于保存SVG文件和检索SVG的疑问

Php 关于保存SVG文件和检索SVG的疑问,php,database,json,file,svg,Php,Database,Json,File,Svg,我制作了一个系统,用户上传一个Gerber文件印刷电路板格式,然后用PHP将该文件GCode转换为SVG 我现在面临一个问题,这实际上是一个架构问题 我应该将SVG保存在文件中还是数据库中 我应该以类似{name:test,data:svgfilegoesher}的JSON格式返回SVG,还是以.SVG格式呈现?我的意思是,JSON对于大数据结构来说足够安全吗 编辑: 转换后的SVG将在网站的许多视图中使用,例如:产品页面、配置页面。。。它不会只出现一次 其主要思想是向服务器发送一个GCode,

我制作了一个系统,用户上传一个Gerber文件印刷电路板格式,然后用PHP将该文件GCode转换为SVG

我现在面临一个问题,这实际上是一个架构问题

我应该将SVG保存在文件中还是数据库中

我应该以类似{name:test,data:svgfilegoesher}的JSON格式返回SVG,还是以.SVG格式呈现?我的意思是,JSON对于大数据结构来说足够安全吗

编辑:

转换后的SVG将在网站的许多视图中使用,例如:产品页面、配置页面。。。它不会只出现一次

其主要思想是向服务器发送一个GCode,一旦有人需要该文件,如果该文件未被渲染,则会进行渲染,并将SVG保存在数据库或文件中,并存储缓存,以避免多次重新处理同一文件

SVG将使用ajax检索,并在页面上插入呈现,但我认为我将使用ajax加载所有内容

该文件一旦发送到服务器,将永远不会被修改,但可以删除,并重新发送


谢谢

这至少取决于两件事:

您计划如何使用这些数据?以后可以修改吗? 网站将获得多少流量。 如果以后可以修改SVG数据,我会将其保存在数据库中。JSON数据在那里应该很好

如果您认为您将获得大量流量,那么我个人不会将其保存在数据库中,除非您有良好的缓存机制。我不确定您是否在使用MySQL,但MySQL中的查询缓存可能对缓存大量数据不太满意

我个人要做的是将SVG保存在一个文件中,并以这样一种方式存储它,即/uploads/SVG/$username/$circuitboardid.SVG,它可以根据数据库中的相关记录进行检索


如果您有大量用户30000+,您的svg目录将变得巨大,并且取决于文件系统,您可能会在每个文件夹中运行文件。

这至少取决于两件事:

您计划如何使用这些数据?以后可以修改吗? 网站将获得多少流量。 如果以后可以修改SVG数据,我会将其保存在数据库中。JSON数据在那里应该很好

如果您认为您将获得大量流量,那么我个人不会将其保存在数据库中,除非您有良好的缓存机制。我不确定您是否在使用MySQL,但MySQL中的查询缓存可能对缓存大量数据不太满意

我个人要做的是将SVG保存在一个文件中,并以这样一种方式存储它,即/uploads/SVG/$username/$circuitboardid.SVG,它可以根据数据库中的相关记录进行检索

如果您有大量用户30000+,您的svg目录将变得巨大,并且根据文件系统的不同,您可能会遇到每个文件夹的文件限制。

更新

对于您正在做的事情,我建议将SVG存储为一个单独的文件,并将SVG作为图像提示返回:headerContent类型:image/SVG+xml;在PHP中

作为补充说明,您说过SVG将使用ajax检索,也可以在页面上使用PHP呈现。这是不对的;SVG是一个文本/XML文件。PHP不呈现SVG,它只将SVG的代码发送到客户端。客户机必须是解析SVG代码并将其呈现为客户机可见图像的机器

原始答案

答案是:视情况而定。你没有给我们太多的支持

SVG是ASCII文本,有点像HTML。你可以学到更多。因此,在JSON中发送SVG文件没有任何问题,只要确保转义任何引号即可

JSON适用于大型结构;问题不在于它的大小,而是它从服务器发送到客户端所需的时间,然后是javascript解析JSON并将SVG呈现为图像所需的时间。我不知道您的设置是什么样的,也不知道SVG文件有多大,但是对于非常大的SVG图像,您可能希望将它们放在一个单独的请求中,只返回SVG,这样客户端机器就不会花时间解析JSON。您必须对应用程序进行性能测试,以确定什么最适合您的需要

至于将SVG存储为文件或存储在数据库中,这取决于数据库,它有多少用于索引的内存以及如何构建索引,是SQL还是NoSQL,或者它有多少存储空间,站点上有多少流量,如何备份数据库和/或文件,人们使用数据库来存储用户图像的缩略图,因此它可以最明确地在其中保存SVG文件。这完全取决于数据库的速度和稳定性。就个人而言,我更喜欢将图像和大量文本保存在硬盘上的单独文件中。

更新

对于您正在做的事情,我建议将SVG存储为单独的文件,并将SVG作为imag返回 e提示:headerContent类型:image/svg+xml;在PHP中

作为补充说明,您说过SVG将使用ajax检索,也可以在页面上使用PHP呈现。这是不对的;SVG是一个文本/XML文件。PHP不呈现SVG,它只将SVG的代码发送到客户端。客户机必须是解析SVG代码并将其呈现为客户机可见图像的机器

原始答案

答案是:视情况而定。你没有给我们太多的支持

SVG是ASCII文本,有点像HTML。你可以学到更多。因此,在JSON中发送SVG文件没有任何问题,只要确保转义任何引号即可

JSON适用于大型结构;问题不在于它的大小,而是它从服务器发送到客户端所需的时间,然后是javascript解析JSON并将SVG呈现为图像所需的时间。我不知道您的设置是什么样的,也不知道SVG文件有多大,但是对于非常大的SVG图像,您可能希望将它们放在一个单独的请求中,只返回SVG,这样客户端机器就不会花时间解析JSON。您必须对应用程序进行性能测试,以确定什么最适合您的需要


至于将SVG存储为文件或存储在数据库中,这取决于数据库,它有多少用于索引的内存以及如何构建索引,是SQL还是NoSQL,或者它有多少存储空间,站点上有多少流量,如何备份数据库和/或文件,人们使用数据库来存储用户图像的缩略图,因此它可以最明确地在其中保存SVG文件。这完全取决于数据库的速度和稳定性。就我个人而言,我更喜欢将图像和大量文本保存在硬盘上的单独文件中。

我通过在php和mySQL数据库中使用以下代码段实现了这一点: 首先,请记住svg基本上存储在文本中,就像HTML也存储在文本中一样。svg标记,无论是不同的标记,其布局都非常类似于HTML标记

存储到数据库中。您必须在实际的mySQL Insertcall中使用以下代码段。我发现,如果先对变量执行此操作,然后将变量放入insert调用中,它将不起作用。函数必须在mySQL语句中。 mysql\u real\u escape\u字符串$myValue

正在检索值中的文本框。假设您的值已经从数据库中检索到,并且现在位于名为theValues的数组中。基本上,我删除任何反斜杠,但在此之前,我要确保它可以正确显示使用htmlentities。因为我知道svg中没有反斜杠,所以服务器将引号替换为\。如果您确实在svg中遇到了一些反斜杠,您只需要在替换函数中更加聪明一点。 $myValue=str_replace\\,htmlentities$theValues->myValue; echo$myValue

返回到页面的原因与上述相同,但htmlentities函数使其仅显示svg的文本,而不是处理svg并显示图片。这仅在将的文本存储在数据库中之后显示svg时才需要,但如果不是第一个数据,只是一个不必要的函数调用,则不会影响您的显示。
str_replace\\,$myValue

我通过在php和mySQL数据库中使用以下代码段实现了这一点: 首先,请记住svg基本上存储在文本中,就像HTML也存储在文本中一样。svg标记,无论是不同的标记,其布局都非常类似于HTML标记

存储到数据库中。您必须在实际的mySQL Insertcall中使用以下代码段。我发现,如果先对变量执行此操作,然后将变量放入insert调用中,它将不起作用。函数必须在mySQL语句中。 mysql\u real\u escape\u字符串$myValue

正在检索值中的文本框。假设您的值已经从数据库中检索到,并且现在位于名为theValues的数组中。基本上,我删除任何反斜杠,但在此之前,我要确保它可以正确显示使用htmlentities。因为我知道svg中没有反斜杠,所以服务器将引号替换为\。如果您确实在svg中遇到了一些反斜杠,您只需要在替换函数中更加聪明一点。 $myValue=str_replace\\,htmlentities$theValues->myValue; echo$myValue

返回到页面的原因与上述相同,但htmlentities函数使其仅显示svg的文本,而不是处理svg并显示图片。这仅在将的文本存储在数据库中之后显示svg时才需要,但如果不是第一个数据,只是一个不必要的函数调用,则不会影响您的显示。
str_replace\\,$myValue

答案在很大程度上取决于生成的SVG的预期用途。你能详细说明一下吗?答案在很大程度上取决于你基因的预期用途

额定SVG。您能详细说明一下吗?备份的方便性是另一个考虑因素:如果SVG文件在数据库中,那么它们可以与其他所有文件一起备份。也就是说,如果没有其他原因,我可能不建议将SVG文件保存在数据库中,只是为了更方便地进行备份。每个SVG文件最多可以有10.000条折线、矩形和圆形,具体取决于GCode是的,很多,我无法压缩它。。。GCode!@!。那么,使用文件?我使用的是Mysql,我不能成为舒尔主机上缓存大小的一员……我会使用文件,然后你可以用PHP读取文件并将其输出到客户端。这相当快。特别是如果它们很大,请将它们作为单独的文件。不要用JSON返回它们;这将花费客户端很长时间来解析它。只需将其作为SVG图像文件返回即可。我保存了一个渲染输出,并检查了大小。大约300kb。我将使用文件,然后。。。谢谢!我说渲染,因为我使用MVC。。。有时这让我感到困惑^^备份的简单性是另一个考虑因素:如果SVG文件在数据库中,那么它们可以与其他所有文件一起备份。也就是说,如果没有其他原因,我可能不建议将SVG文件保存在数据库中,只是为了更方便地进行备份。每个SVG文件最多可以有10.000条折线、矩形和圆形,具体取决于GCode是的,很多,我无法压缩它。。。GCode!@!。那么,使用文件?我使用的是Mysql,我不能成为舒尔主机上缓存大小的一员……我会使用文件,然后你可以用PHP读取文件并将其输出到客户端。这相当快。特别是如果它们很大,请将它们作为单独的文件。不要用JSON返回它们;这将花费客户端很长时间来解析它。只需将其作为SVG图像文件返回即可。我保存了一个渲染输出,并检查了大小。大约300kb。我将使用文件,然后。。。谢谢!我说渲染,因为我使用MVC。。。有时它会让我困惑^^我正在使用另一种保存文件的形式:USERID_PCBID_md5ofile.file,但这是原始的,缓存的SVG将是相同的UID,它不是顺序的,因为服务器中的UID您是否定期删除完成的PCB图像?如果您将它们都存储在同一个文件夹中,您可能会遇到如上所述的速度减慢或文件系统限制。谢谢。我想现在,我会照原样做,然后在文件夹之间做一些分离,我将如何使用和使用什么来分离我还不知道…我会使用md5,只分离前两对字符,并将它们用作文件夹。例如,04/3c/USERID\u PCBID\u 043c…b52d.file关键是要有冲突,这样你就可以将图像分发到不同的文件夹中。你只需要保存md5,你就可以找到路径。实现取决于您。我正在使用另一种保存文件的形式:USERID\u PCBID\u MD5OFFILE.file,但这是原始的,缓存的SVG将是相同的UID,它不是顺序的,因为服务器中的UID。您是否定期删除完成的PCB图像?如果您将它们都存储在同一个文件夹中,您可能会遇到如上所述的速度减慢或文件系统限制。谢谢。我想现在,我会照原样做,然后在文件夹之间做一些分离,我将如何使用和使用什么来分离我还不知道…我会使用md5,只分离前两对字符,并将它们用作文件夹。例如,04/3c/USERID\u PCBID\u 043c…b52d.file关键是要有冲突,这样你就可以将图像分发到不同的文件夹中。你只需要保存md5,你就可以找到路径。实施取决于您。